跟我學(xué)Rsyslog

admin Linux運(yùn)維評(píng)論521字?jǐn)?shù) 3321閱讀模式
摘要

在數(shù)據(jù)為王的時(shí)代,日志管理是一個(gè)繞不開的話題,相應(yīng)的開源軟件有不少,比如熱門的三件套:Logstash、ElasticSearch、Kibana,可惜我對(duì)這些高大上的東西往往心存敬畏,不敢輕易觸碰,相比較而言,我更喜歡能夠快速上手的東西。

對(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

版權(quán)聲明:文章圖片資源來源于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)留言刪除!!!
廣告也精彩
admin
  • 本文由 發(fā)表于 2022年12月18日 13:20:45
  • 轉(zhuǎn)載請(qǐng)務(wù)必保留本文鏈接:http://yudch.cn/9623.html
匿名

發(fā)表評(píng)論

匿名網(wǎng)友 填寫信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: