朱曉亮 陳云芳 陸有為
南京郵電大學(xué)物聯(lián)網(wǎng)學(xué)院 江蘇 210003
本文研究一種基于rsyslog系統(tǒng)日志處理系統(tǒng),通過收集*nix系統(tǒng)里產(chǎn)生的各種log,分析并確定系統(tǒng)中的問題所在,最終以Web方式展示出來,方便的進行檢索和分析,具有較高的理論和實用價值。
對于*nix平臺來說,log主要包括應(yīng)用層的log、系統(tǒng)層的log以及虛擬機的log。
應(yīng)用層的log:大部分應(yīng)用層的log默認會存儲在/var/log/下面,如果通過ls列出/var/log/下面的目錄文件,我們會看到很多熟悉的名字,比如/var/log/apache2,則代表是由apache2服務(wù)產(chǎn)生的log文件;再比如/var/log/samba則代表是由Samba服務(wù)產(chǎn)生的log文件。
系統(tǒng)層的log:系統(tǒng)的log信息主要是跟Ubuntu的系統(tǒng)信息相關(guān),跟應(yīng)用層的log關(guān)系不是很緊密,常見的包括用戶的認證機制的日志信息,系統(tǒng)的daemon,系統(tǒng)的messages,以及系統(tǒng)所有的壓縮文件也就是其本身syslog。
虛擬機的log:對于虛擬機來說,目前主流的包括xen以及KVM,其中前者使用范圍更為廣泛,同樣,在/var/log/下有xen/目錄,該目錄下會包含console/目錄,記錄通過console登錄的信息,domain-builder-ng.log文件記錄domU的信息,xen-debug文件以記錄xen虛擬機的debug信息等。而對于KVM來說,則包含/var/log/libvirt/目錄,該目錄下面的文件記錄的是KVM相關(guān)的log信息。
Syslog是一個很著名的網(wǎng)絡(luò)協(xié)議,是一種在Unix和類Unix的計算機系統(tǒng)上使用的協(xié)議,它用于轉(zhuǎn)發(fā)以太網(wǎng)絡(luò)中的日志消息。它實施了基本的syslog協(xié)議,并且為syslog協(xié)議擴增了基于內(nèi)容的過渡、豐富的過濾功能和靈活的配置選項,還增添了一些重要功能,比如使用TCP進行傳輸。
(1) rsyslog的功能
Rsyslog通過隊列來耦合兩個動作,在隊列中,一方作為生產(chǎn)者,一方作為消費者,生產(chǎn)者會生產(chǎn)一些東西,一般,“一些東西”通常是syslog信息,當然,隊列也可以用于其他的目的。
Rsyslog有一個主隊列和多個action(動作)隊列,消息輸入模塊把消息pass到主隊列,再由主隊列根據(jù)rules分給各個action隊列。
在配置文件里,可以通過MainMsg和Action分別用來設(shè)定主隊列和aciton隊列的參數(shù)。在隊列創(chuàng)建前,相同的參數(shù)可以指定多次,最后指定的優(yōu)先。
主隊列,在解析完配置文件后,開始創(chuàng)建。Action隊列,在每次動作選擇時被創(chuàng)建。
Rsyslog支持多種模式,在配置文件里通過$
① 直接隊列,不排隊或緩存任何隊列元素,直接傳遞元素到下一個處理機制;
② 內(nèi)存隊列,將隊列緩存到內(nèi)存中,等到一定的觸發(fā)條件再傳遞;
③ 磁盤輔助內(nèi)存隊列,將隊列緩存到磁盤中,等到一定的觸發(fā)條件再傳遞。
(2) rsyslog的使用
在實際的使用過程中,我們可以通過配置文件和查看相應(yīng)的日志文件來使用rsyslog。然而,在許多應(yīng)用場景下,我們往往需要通過程序產(chǎn)生輸出信息并進行記錄,也就是說要把一些信息寫成日志文件。正常情況下運行程序的人不用關(guān)心日志里的內(nèi)容,只有在出現(xiàn)問題的時候才會查看日志文件里的內(nèi)容以確定問題所在。
因此,下面設(shè)計通過rsyslog日志系統(tǒng)提供的API調(diào)用接口,來使用程序?qū)崿F(xiàn)對rsyslog的使用。
常用的rsyslog系統(tǒng)調(diào)用包括如下四個:
① void openlog(const char *ident, int option, int facility):打開日志設(shè)備;
② void syslog(int priority, const char *format,...):寫入日志;
③ void closelog(void):關(guān)閉日志設(shè)備;
④ vsyslog:它和syslog功能類此,只是有不同的參數(shù)。
增加一條log信息的過程(如圖1):
圖1 rsyslog系統(tǒng)調(diào)用
我們可以通過下面一小段程序來熟悉這幾個系統(tǒng)調(diào)用:
一個好的日志系統(tǒng),不但需要一個魯棒性很高的后端,還需要一個體驗很高的前端。對于寫操作要求很高的日志系統(tǒng),我們選用 MySQL 作為我們log存儲的數(shù)據(jù)庫系統(tǒng),而使用 PHP 這門全球最流行的腳本語言來構(gòu)成前端。
同時我們使用 MyISAM 作為數(shù)據(jù)庫的存儲引擎,也就是默認的引擎,因為這里的應(yīng)用是不需要事務(wù)的,處理的基本的CRUD操作,而且以 insert 為主。
接下來我們需要建立業(yè)務(wù)相關(guān)的數(shù)據(jù)庫了。數(shù)據(jù)庫的名字命名為 Syslog。這里需要建立表1、表2。
SystemEvents,該表存放log的實際信息,包括惟一標識號 ID,log到達logserver 的時間,F(xiàn)acility級別,Priority級別,log的內(nèi)容 Message 等。
SystemEventsProperties,該表存放 SystemEvents 的相關(guān)屬性,包括一個惟一的表示,同時也作為該表的主鍵 ID 號,以及一些保留的字段等。
表1 Syste5mEvents 表部分條目
表2 SystemEventsProperties 表部分條目
在完成建立表格之后,需要通知rsyslog以數(shù)據(jù)庫的方式來收集log信息:
在完成了數(shù)據(jù)庫的設(shè)計之后,開始Web的設(shè)計,這里主要包括6大模塊。它們分別是如下的:
用戶登錄登出(Login/Logout);
數(shù)據(jù)檢索(Search);
事件展示(Show Events);
數(shù)據(jù)分析報告(Statistics);
用戶管理(Admin Center);
數(shù)據(jù)庫讀寫 (DB I/O)。
用戶管理則是對登錄該系統(tǒng)用戶的日常的操作維護,包括用戶以及用戶組的權(quán)限等問題;數(shù)據(jù)檢索主要是通過關(guān)鍵詞來準確匹配需要的搜索的內(nèi)容;事件展示是該log收集分析系統(tǒng)的主要界面,也就是進入該系統(tǒng)的首頁面,會根據(jù)默認的情況展示log收集的數(shù)據(jù),以及相應(yīng)的log信息的分類、劃分的等級等;報告生成主要是對log信息的分類統(tǒng)計。
這里通過手動的測試,來測試寫入 /var/log/messages 的情況,我們需要一個簡單 logger 命令來測試(如圖2):
$ logger -p local3.info "Msg"
圖2 rsyslog測試示例
第一行日志顯示: May 22 17:10:09 lvs-1 yunbg: 11其表示意思如下:第一列:日志產(chǎn)生時間;第二列:產(chǎn)生此日志的主機名稱;第三列:產(chǎn)生此日志的應(yīng)用程序或用戶名稱;第四列:日志的內(nèi)容。正如前面所說的,應(yīng)用程序的日志級別是由應(yīng)用程序所決定的。部分應(yīng)用程序可通過配置,定義其日志級別。例如,/etc/ssh/sshd_config。
這里根據(jù)“Other filters”包括“Syslog Facility”“Syslog Severity”等類別來進行搜索,通過關(guān)鍵詞加上符號的形式來實現(xiàn),比如“facility:local0 severity: warning”這個則是搜索Facility為local0而severity為warning級別的內(nèi)容。檢索界面如圖3所示。
圖3 log檢索
通過檢索生成的報告中,包括 Date、Facility、Severity、Host、Syslogtag、Messagetype、Message 幾個欄目,分別表示日志到達的時間、其 Facility的值、嚴重等級程度、來自于哪臺主機、其 syslog 的 tag、信息的類型以及最重要的一項其顯示的消息,即如圖4所示。
圖4 數(shù)據(jù)報告展示
對于 Message 這一欄,如果點擊,可以得到更加詳細的消息信息。整個界面根據(jù)時間進行排序,時間越早的排在前面,偏晚的則排在后面,這也符合我們的需求,設(shè)計日志系統(tǒng)的主要目的是用來發(fā)現(xiàn)問題解決問題的,因此我們可以通過查找過濾關(guān)鍵字來找到我們需要的日志信息。
本文介紹了 *nix 平臺下的log,歸納了應(yīng)用層、系統(tǒng)層以及虛擬機的log文件。熟悉rsyslog的功能以及其核心功能——隊列。在此基礎(chǔ)上,將log內(nèi)容收集到數(shù)據(jù)庫中并以Web的方式展現(xiàn)出來。保證了數(shù)據(jù)庫的讀寫效率和在出現(xiàn)系統(tǒng)問題的情況下,能很快通知并及時解決系統(tǒng)故障。同時,文章也存在可以改進和拓展的方面。在log的分析方面并不是很完善,可以通過一定的匹配算法實現(xiàn)自動化的過濾、展示以及根據(jù)預(yù)定的閾值進行報警,以便及時通過log發(fā)現(xiàn)系統(tǒng)中存在的問題,更好的體現(xiàn)log的作用。
[1] 乃密斯.Linux系統(tǒng)管理技術(shù)手冊.人民郵電出版社.2008.
[2] 馬修.Linux程序設(shè)計-(第3版).人民郵電出版社.2007.
[3] Rainer Gerhards, Adiscon GmbH. rsyslog: going up from 40K messages per second to 250K.
[4] 張文江,吳慶波.Linux日志文件系統(tǒng)研究.計算機工程與應(yīng)用.2006.
[5] 劉丹,賴鋒.系統(tǒng)安全中Linux日志的實用研究.世界電信.2003.
[6] 李燕南,劉新等.主機日志分析與研究[J].中國高新技術(shù)企業(yè).2010.
[7] R. Gerhards. The Syslog Protocol. RFC 5424 (Proposed Standard),March 2009.