KirsT定義
下圖為一個log信息的範例
e,01/07/2005 03:51:24,KirinReplication,Get Partition node configuration from Coordinator,SrcFile="kirscooandhandler.cpp" SrcFunc="KirsReplicitionNodeViewRequest::OnSentMessageComplete" SrcLine="455" Pid="1288" Tid="1152"
KirsT格式
一條log最大長度為4096
位元組,以逗號作為
分隔設定,一般包括以下信息
log type
其內容為一個位元組,表示log的類型信息,根據log信息的種類和級別不同,產生不同類型的log type信息。常見的log type主要包含以下幾種
Log type
| Log type informations
|
e
| err log which is always launch by core dump, The most horrible log of the MSRA
|
w
| Warning log ,which is should be detected by the dev team , the log should not happened
|
i
| Information log which show the information of the software running ,from the information, the user could know the progress of the software
|
p
| Pack log ,which is show by the pack transformation
|
z
| Zero log , when the software quit with successful a zero log launch
|
t
| time log ,when the DFS do the time allot process ,it will show
|
c
| Customer log , which is defined by the customers
|
b
| Binary program launch it
|
d
| Debug log ,the dev do UTing, should not leave it alone
|
s
| System log
|
針對kisT的需求來說,主要針對的是error log 和warning log的收集。
Log time
Log time主要記錄為這一條log的發生時間,其格式為 MM/DD/YYYY HH:MM:SS, 作為krirn分散式系統的一個特點為:krirn 分散式系統的所有
節點可能分布在與隸屬於不同時區的機房中,每一台節點的時間均為當地時間,這就給krirnAT 造成了一個很大的麻煩即,如果需要將屬於不同時區的節點的log信息進行匯總的話,同一時間產生的Log 可能會被分開處理和收集,最終會導致一個生成一個錯誤的結果,給進行分析造成不必要的麻煩。
產生Log的模組名
KirsT,由一台Master (DM)、數台Shadow Master(可選)和多台數據節點機(chunk server)以及運行於應用程式處的DFS客戶端庫(dfsapi)、DPF Agent以及DFS實用工具子系統(如DFS監控子系統、DFS目錄樹瀏覽子系統、
檔案目錄複製子系統、數據導入等)等組成。DM及Shadow DM用來保存整個DFS的元數據(metadata),chunk server用來保存
檔案內容,dfsapi lib提供DFS到應用程式的接口。每個
檔案被分成固定大小的塊(即chunk),每個chunk被複製後保存在多台chunk server上(預設為3台)。通過DFS的
客戶端庫(dfsapi),應用程式的多個客戶端可以並發地讀寫
檔案內容其完成的主要功能是:
檔案的打開、關閉、讀出、追加、寫入(overwrite)
檔案屬性設定和修改(內容拷貝數,用戶許可權,壓縮方法,stream or structure content…)
客戶端的每個單一操作都是原子操作
只要DM及Shadow DM中超過半數線上,則系統可用
單一DM宕機重啟後系統可正常工作
少於chunk拷貝數的任意台chunk server下線時該
檔案仍然可用
單一機架/房間所有chunk server下線時系統仍然可用(假設系統包含至少兩個機架/房間且機架/房間的機器容量網路配置大致相當)
經過配置的新chunk server機器自動加入系統
不論增加還是減少chunk server,系統都能在一段時間後達到所有chunk server的
負載平衡DM和Shadow DM的線上checkpoint功能
Chunk server對其上的chunk數據進行校驗
未及時更新的chunk拷貝(因chunk server離線等)能被發現並剔除
每個chunk server同時是一個客戶端。
針對不同的需求,存在著不同的模組,kirin-AT所收集的log 也主要有這些模組產生
4 log body
主要指的是krirn的log內容,符合微軟KirinStore系統行為規範1.07v標準,大小不超過2048位元組,其內容主要包括
1)編譯二進制信息,由dev設計並輸入代碼中
3)SrcFunc:所調用函式名和類名
4)SrcLine:log所在行號
5)Pid:進程名
6)Tid:執行緒名
在krirnAT的設計中,為了金大程度上增加其的
兼容性,和可配置型,本工具需要對不同格式的Log兼容,例如,在前文中提到的KirinStore系統行為規範1.07v標準的格式順序為:Log type ,Log time,Log info,和log body四部分組成。但是在MSTD的log格式標準為:log type, log info 和 log decryptions 三部分組成.所以,在kirinAT中,需要設計一種算法,來自動的匹配不同種類的log格式。
kirinAT中處理此任務的模組是LogReader,,其完成的功能是,從上游模組
Seeker中取得log
檔案,讀取log檔案,對log檔案內容進行類型識別和匹配,導出符合標準kirinAT標準的log格式,將結果傳遞給下一個模組 Parser
實現方法
設計一個類LogForKirin
char logType//Log type
char logTime[40] //Log time
char logInfo[2048] // Log info
char logBody[2048] //log body
主要包含以下方法
private setValue(char * ,char *,char *,char *) 給LogForKirin變數賦值 public putIntoLogForKirin(Log *) 外部調用
private moduleSeek() 識別為符合kirinAT要求的格式
public outputValue()輸出
實現邏輯如下
1 首先讀取配置
檔案reader.config,其檔案的格式如下
divide symbol ,
Log type 1
Log time 2
Log info 3
log body 5
divide symbol所對應的字元為該log
檔案的
分隔設定,log檔案的每一行按照分隔設定來劃分成n份,其中,log type 為第一份(即第一個逗號以前的檔案內容),log time為第二份,log info為第三份,log body為第五份,以此類推。
2將
配置項讀取後,開始讀取log檔案,調用
putIntoLogForKirin方法,將所有log檔案的log信息導入到類LogForKirin中,該方法會根據配置檔案,查找輸入的log信息的
分隔設定,將其進行統計,利用所羅門倒排算法,將所需要的log信息過濾出來,調用setValue方法輸入到類的實例中,一條log輸入完成後繼續輸入其餘的log信息,最終得出一個LogForKirin實例的數組。將結果輸出到Parser模組中。
意義
在
分散式系統中,運行著大量的應用程式和後台程式,這些應用程式的log格式並不相同。之前並沒有一個工具能夠實時的監控並抓取各個程式產生的log信息,這給開發和測試人員發現程式可能存在的問題增加了很大的麻煩,KirsT的出現,徹底的解決了這個問題,目前的套用不僅僅是
監控系統產生的日誌
檔案,對於很多
分散式應用程式來講,KirsT只需要經過簡單的配置上的修改,就能有針對性的收集各種分散式系統程式所產生的不同的log並生成報告