日誌儲存為文字檔案,我們在查詢所需要的資訊的時候,一般會用到grep ,egrep等等的命令,比如: grep 大鵬 /log/scene*,就可以檢索出大鵬作為關鍵字的相對應的資訊。關於grep等命令的使用, 這
有詳細的介紹,但是,簡單的採用grep命令可能不能滿足我們的需求,我在工作的過程中就遇到了這樣的問題,我們的伺服器方面有點記憶體洩露,之前的經驗是通過分析記憶體管理器的相應日誌查詢,記憶體相應的日誌資訊大概是這樣的:
081205-01:53:00 gs[2205] debug: 分配器:256,占用大小:6024,占用個數:1,使用個數:1 ,釋放個數:0,佔比:100.00% .
. .081205-01:53:00 gs[2205] debug: 分配器個數:30,占用:297123456
上面的資訊顯示了01:53:00時刻記憶體管理器每個分配器占用的大小和總占用的大小的資訊。
現在我有這樣的需求: 希望可以伺服器啟動到現在每個分配器增加的大小,和總占用增加的大小,然後增加的大小從大到小進行排序,如果某個分配器增加的大小出現異常,就表示呼叫這個分配器的地方出現了沒有釋放記憶體的問題。
在開始之前有乙個問題需要解決,那就是伺服器可能是中途重新啟動了,也就是記憶體分配器的大小是從新計算的,比如啟動的時候會打出這樣的日誌:
081205-01:53:00 gs[2205] debug: program start as demeon
我們要做的就是去掉這條日誌之前的相應資訊,可以通過使用 sed 命令達到目的.
sed '1,/program/d' ./text > ./text2
這樣我們就可以把text中第一次出現program關鍵字之前的行全部刪除,輸出到text2中
這樣我們需要編寫乙個指令碼,方面的提取我們需要的資訊。
首先我們統計記憶體管理器總增加的大小,可以通過一下的步驟:
2: sed '1,/program/d' ./tempallsize.txt > ./tempallsize2.txt ,去掉伺服器啟動之前的資料
3: minallsize=$(sort -u -t: +6n ./tempallsize2.txt | head -n 1 | awk -f : ' ')
maxallsize=$(sort -u -t: +6nr ./tempallsize2.txt | head -n 1 | awk -f : '')
分配器總大小最小的值儲存為minallsize變數中,最大值maxallsize中。然後兩個值相減就可以得出總增加的大小
其次我們需要輸出每個分配器增加的大小,我們可以這樣
2: sed '1,/program/d' ./tempalltext.txt > tempaftersort.txt ,出去啟動前的資料
3:
while read line do
done < ./tempaftersort.txt
上面一段小指令碼將每個分配器的增加的大小輸出到memorystat.txt中
4: sort -t= +3nr ./memorystat.txt ,按每個分配器增加的大小進行從大到小的排序
最後記得刪除臨時檔案。
上面的小指令碼中,主要用到了awk,sort,sed幾個命令,可以從這參考:
對shell指令碼感興趣的可以參考這:
還有這:
利用shell指令碼快速定位查詢日誌
為了解決這種問題,大多數人會去編寫shell指令碼,用來檢索日誌檔案,這樣能篩掉很多無用檔案,減輕查日誌的工作量。伺服器集群部署下,同樣適用,我們可以在每台機器同樣的目錄下放乙份指令碼檔案,然後通過xshell對所有遠端會話執行指令碼,所有連線到的機器就都能執行指令碼了。我們快速定位問題的前提是首先...
利用shell指令碼對大檔案進行分割
有系統運維的過程中,日誌檔案往往非常大,這樣就要求對日誌檔案進行分割,在此特用shell指令碼對檔案進行分割 方法一 其中httperr8007.log為你想分割的大檔案,file file.log 為分割後的檔案,最後為file 1.log,file 2.log,file 3.log 分割完後的每...
linux使用shell指令碼對多機器日誌監控
遇到的難題 日誌分散在三颱伺服器,每次報錯檢視日誌都需要一台一台找,非常麻煩,所以第一反應就是有沒有比較好的日誌系統可以一次性檢視所有的日誌,後來發現都需要搭建,或者安裝,或者配置相關服務,所以想了一些簡單的監控多機日誌的方案。定義設三颱機器為 c1,c2,c3 c1同時為跳板機 嘗試方案一 配置簡...