對(duì)于日志管理,老版本的Linux缺省使用Syslog,其配置大致如下所示:
shell> cat /etc/syslog.conf # Log all kernel messages to the console. # Logging much else clutters up the screen. # kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log
其中涉及兩個(gè)概念:Facility和Severity,中文的意思大致是類型和級(jí)別。重點(diǎn)說明兩條配置的含義:首先,所有Severity大于等于info的信息都會(huì)被保存到「/var/log/messages」中,但是Facility為mail、authpriv、cron的消息例外;其次,所有Facility為mail的消息都會(huì)保存到「/var/log/maillog」中,日志文件前面的減號(hào)表示的意思是異步寫文件。
關(guān)于Syslog的內(nèi)容我并不想多說,否則就偏離了主題,大家如果有不清楚的地方,可以參考鳥哥的Linux私房菜。雖然Syslog中規(guī)中矩,但是隨著時(shí)間的推移,無論是功能還是性能,它都顯得捉襟見肘,于是出現(xiàn)了:Rsyslog和Syslog-ng,它們都涵蓋SysLog的常用功能,不過在功能和性能上更為出色,至于孰優(yōu)孰劣是個(gè)仁者見仁智者見智的問題,鑒于多數(shù)Linux發(fā)行版均選擇了Rsyslog,姑且讓我隨波逐流一次。
如果說Rsyslog有哪些缺點(diǎn)的話,那么兼容性無疑是很顯眼的一個(gè),不同版本之間的差異比較大,使用時(shí)需要格外留意一下。在使用前最好完整的瀏覽幾遍官方文檔,此外網(wǎng)絡(luò)上有一些不錯(cuò)的文章可供參考,比如:rsyslog研究,rsyslog和logrotate服務(wù),核心概念在這些資料里都有提及,本文就不贅述了,這里著重與快速上手。
安裝配置
我以CentOS為例,說明如何通過RPM來安裝Rsyslog:
shell> cd /etc/yum.repos.d/ shell> wget http://rpms.adiscon.com/v8-stable/rsyslog.repo shell> yum install rsyslog
安裝完成后,我們可以查看一下到底都裝了些什么東西:
shell> rpm -ql rsyslog /etc/logrotate.d/syslog /etc/pki/rsyslog /etc/rc.d/init.d/rsyslog /etc/rsyslog.conf /etc/rsyslog.d /etc/sysconfig/rsyslog ...
如果系統(tǒng)里有Syslog的話,那么在啟動(dòng)Rsyslog之前,別忘了先關(guān)閉它:
shell> service syslog stop shell> service rsyslog start
如果運(yùn)行Rsyslog時(shí)出現(xiàn)問題,那么可以通過激活調(diào)試模式來查找原因:
shell> cat /etc/sysconfig/rsyslog # Options for rsyslogd # Syslogd options are deprecated since rsyslog v3. # If you want to use them, switch to compatibility mode 2 by "-c 2" # See rsyslogd(8) for more details SYSLOGD_OPTIONS="-d -n"
如果你想測(cè)試Rsyslog是否工作的話,可以通過系統(tǒng)內(nèi)建的logger命令發(fā)消息;如果你想測(cè)試Rsyslog性能如何的話,可以考慮使用官方提供的tcpflood。
實(shí)例演示
在我們動(dòng)手之前,有必要了解一下Rsyslog的工作流程,說起來非常簡(jiǎn)單:首先數(shù)據(jù)通過輸入模塊進(jìn)入主隊(duì)列,然后經(jīng)由過濾條件分解到各個(gè)子隊(duì)列,最后交給輸出模塊。
理解了Rsyslog的工作流程,我們就可以實(shí)例演示了,請(qǐng)聽題:請(qǐng)把多臺(tái)Web服務(wù)器上的access日志發(fā)送到統(tǒng)一的App服務(wù)器。實(shí)際上新版Nginx可以直接發(fā)Syslog請(qǐng)求。
設(shè)置Web服務(wù)器:
module(load="imfile") ruleset(name="remote") { action(type="omfwd" Protocol="tcp" Target="<HOST>" Port="<PORT>") stop } input(type="imfile" File="/path/to/web/access.log" Facility="user" Severity="info" Tag="web_access" PersistStateInterval="1" Ruleset="remote")
通過imfile輸入模塊,我們引入文件,并且綁定Ruleset。不過需要說明的是,需要通過配置WorkDirectory來聲明狀態(tài)文件的保存位置,這個(gè)狀態(tài)文件被用來記錄掃描日志位置等信息,PersistStateInterval被用來控制狀態(tài)文件的持久化頻率,測(cè)試階段,可以把它設(shè)置的小點(diǎn)兒,正式階段,出于效率的考慮,可以把它調(diào)大點(diǎn)兒,但是相應(yīng)的也會(huì)出現(xiàn)丟失數(shù)據(jù)的潛在風(fēng)險(xiǎn),具體設(shè)置多少合適需要結(jié)合自己的情況來斟酌。
設(shè)置App服務(wù)器:
module(load="imtcp") template(name="msg" type="string" string="%msg:2:$%\n") ruleset(name="analysis") { action(type="omfile" File="/path/to/access.log" Template="msg") stop } input(type="imtcp" Port="<PORT>" Ruleset="analysis")
通過omfile輸出模塊可以簡(jiǎn)單的實(shí)現(xiàn)匯總,利用Template指令定義僅記錄msg數(shù)據(jù),此外還使用Property Replacer去除了msg開頭的空格。
如果僅此而已就太無趣了,實(shí)際上利用omprog輸出模塊,我們可以玩得更出彩:
module(load="omprog") ruleset(name="analysis") { action(type="omprog" Binary="/usr/bin/php /path/to/script.php" Template="msg") stop }
數(shù)據(jù)通過管道無縫傳遞給外部程序,可以說賦予了Rsyslog更多的可能性,你可以使用任何熟悉的語言來實(shí)現(xiàn),以PHP為例,大致代碼如下所示:
<?php while (($data = fgets(STDIN)) !== false) { // ... } ?>
一個(gè)需要注意的地方是,如果循環(huán)里的業(yè)務(wù)邏輯比較重,那么可能會(huì)導(dǎo)致?lián)矶?,此時(shí)可以考慮不直接在循環(huán)里處理業(yè)務(wù)邏輯,而是稍作處理,直接轉(zhuǎn)發(fā)給 Gearman 之類的任務(wù)分發(fā)器,稍后有 Gearman 把任務(wù)分發(fā)給相應(yīng)的 Worker 來處理。
友情提示:如果主配置文件太臃腫的話,可以考慮使用子配置文件:
# Include all config files in /etc/rsyslog.d/ $IncludeConfig /etc/rsyslog.d/*.conf
評(píng)論