安裝 rsyslog 和 logroate 服務(wù)
yum install rsyslog
yum install logrotate
rsyslog配置文件
#rsyslog v3 config file [兼容版本號(hào)]
#### MODULES #### 加載模塊
$ModLoad imuxsock.so # 本地系統(tǒng)日志 (e.g. via logger command)
$ModLoad imklog.so # provides kernel logging support (previously done by rklogd)
# 允許514端口接收使用UDP協(xié)議轉(zhuǎn)發(fā)過來的日志
#$ModLoad imudp.so
#$UDPServerRun 514
# 允許514端口接收使用TCP協(xié)議轉(zhuǎn)發(fā)過來的日志
#$ModLoad imtcp.so
#$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####
# 定義日志格式默認(rèn)模板
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
#### RULES ####
# 關(guān)于內(nèi)核的所有日志都放到/dev/console(控制臺(tái))
#kern.* /dev/console
# 記錄所有日志類型的info級(jí)別以及大于info級(jí)別的信息到 /var/log/messages守问,但是mail郵件信息,authpriv驗(yàn)證方面的信息和cron時(shí)間任務(wù)相關(guān)的信息除外
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# authpriv驗(yàn)證相關(guān)的所有信息存放在/var/log/secure
authpriv.* /var/log/secure
# 郵件的所有信息存放在/var/log/maillog; 這里有一個(gè)-符號(hào), 表示是使用異步的方式記錄, 因?yàn)槿罩疽话銜?huì)比較大
mail.* -/var/log/maillog
# 計(jì)劃任務(wù)有關(guān)的信息存放在/var/log/cron
cron.* /var/log/cron
# 記錄所有的大于等于emerg級(jí)別信息, 以wall方式發(fā)送給每個(gè)登錄到系統(tǒng)的人(* 代表所有在線用戶 )
*.emerg *
# 記錄uucp,news.crit等存放在/var/log/spooler
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log 啟動(dòng)的相關(guān)信息
local7.* /var/log/boot.log
# 轉(zhuǎn)發(fā)規(guī)則
# remote host is: name/ip:port, port optional (e.g. 192.168.0.1:514)
*.* @@remote-host:514
# @@表示通過tcp協(xié)議發(fā)送 @表示通過udp進(jìn)行轉(zhuǎn)發(fā)
日志級(jí)別
-
debug
有調(diào)式信息的坑资,日志信息最多 -
info
一般信息的日志耗帕,最常用 -
notice
最具有重要性的普通條件的信息 -
warning
警告級(jí)別 -
err
錯(cuò)誤級(jí)別,阻止某個(gè)功能或者模塊不能正常工作的信息 -
crit
嚴(yán)重級(jí)別袱贮,阻止整個(gè)系統(tǒng)或者整個(gè)軟件不能正常工作的信息 -
alert
需要立刻修改的信息 -
emerg
內(nèi)核崩潰等嚴(yán)重信息 -
none
什么都不記錄
從上到下仿便,級(jí)別從低到高,記錄的信息越來越少
連接符號(hào)
-
.xxx
:表示大于等于xxx級(jí)別的信息 -
.=xxx
:表示等于xxx級(jí)別的信息 -
.!xxx
:表示在xxx之外的等級(jí)的信息
Actions
記錄到普通文件或設(shè)備文件:
. /var/log/file.log # 絕對(duì)路徑
. /dev/pts/0
logger 命令用于產(chǎn)生日志:logger -p local3.info 'KadeFor is testing the rsyslog and logger'
轉(zhuǎn)發(fā)到遠(yuǎn)程::
. @192.168.0.1 # 使用UDP協(xié)議轉(zhuǎn)發(fā)到192.168.0.1的514(默認(rèn))端口
. @@192.168.0.1:10514 # 使用TCP協(xié)議轉(zhuǎn)發(fā)到192.168.0.1的10514(默認(rèn))端口發(fā)送給用戶(需要在線才能收到)::
. root
. root,kadefor,up01 # 使用,號(hào)分隔多個(gè)用戶
. * # *號(hào)表示所有在線用戶忽略,丟棄::
local3.* ~ # 忽略所有l(wèi)ocal3類型的所有級(jí)別的日志執(zhí)行腳本::
local3.* ^/tmp/a.sh # ^號(hào)后跟可執(zhí)行腳本或程序的絕對(duì)路徑
# 日志內(nèi)容可以作為腳本的第一個(gè)參數(shù). 可用來觸發(fā)報(bào)警
注意: 日志記錄的順序有先后關(guān)系!
實(shí)例: 過濾特定的日志到文件
# 過濾日志, 由:號(hào)開頭
:msg, contains, “error” /var/log/error.log
:msg, contains, “error” ~ # 忽略包含error的日志
:msg, contains, “user nagios” ~
:msg, contains, “user kadefor” ~
:msg, contains, “module-alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write” ~
local3.* ~
& ~ # 忽略所有的日志.
實(shí)例: 使用模板來定義日志格式
定義默認(rèn)的日志格式:
$template myFormat,”%rawmsg%\n”
$ActionFileDefaultTemplate myFormat
如果不要$ActionFileDefaultTemplate myFormat
這一行, 就需要像這樣來使用模板:
在日志文件后添加模板名, 并用;號(hào)分隔
$template myFormat,”%rawmsg%\n”
authpriv.* /var/log/secure;myFormat
mail.* /var/log/maillog;myFormat
cron.* /var/log/cron;myFormat
*.emerg *
uucp,news.crit /var/log/spooler;myFormat
local7.* /var/log/boot.log;myFormat
實(shí)例: remote log 遠(yuǎn)程發(fā)送與接收:
配置服務(wù)端(接收)
$ModLoad imtcp.so # 使用tcp方式
$InputTCPMaxSessions 500 # tcp接收連接數(shù)為500個(gè)
$InputTCPServerRun 514 # tcp接收信息的端口
# 定義一個(gè)名為logformat模板, 為信息加上日志時(shí)間
$template logformat, "%TIMESTAMP:::date-mysql% %FROMHOST-IP%%msg%\n"
# 定義日志文件的名稱攒巍,按照年月日
$template DynFile, "/var/log/tlog%$year%%$month%%$day%.log"
# 把rawmsg(也可以使用msg)日志中包含sdns_log標(biāo)志的信息寫到DynFile定義的日志文件里
:rawmsg, contains, "sdns_log" ?DynFile;logformat
# 這個(gè)表示丟棄包含sdns_log標(biāo)志的信息, 一般都加上它, 以免多個(gè)日志文件記錄重復(fù)的日志
:rawmsg, contains, "sdns_log" ~
配置客戶端(發(fā)送)
# 把包含sdns_log的信息通過tcp發(fā)到192.168.1.2 @@表示tcp @表示udp
:rawmsg, contains, “sdns_log” @@192.168.1.2 # 默認(rèn)514端口
# 這個(gè)表示丟棄包含sdns_log標(biāo)志的信息,防止這個(gè)信息寫到本機(jī)的/var/log/message
:rawmsg, contains, “sdns_log” ~
測(cè)試:在客戶端上執(zhí)行 logger -p user.info "sdns_log 34334"
在服務(wù)端的/var/log/目錄里是否有tlog*日志產(chǎn)生
如果要把不同服務(wù)器發(fā)送過來的日志保存到不同的文件, 可以這樣操作
:fromhost-ip, isequal, “192.168.0.160″ /var/log/host160.log
:FROMHOST-IP, isequal, “192.168.0.161″ /var/log/host161.log
:FROMHOST-IP, startswith, “192.168.1.” /var/log/network1.log
:FROMHOST-IP, startswith, “192.168.2.” /var/log/network2.log
屬性替代
屬性替代
Rsyslog 預(yù)定義了一些屬性嗽仪,來代表消息中的信息,我們可以在定義輸出格式柒莉、動(dòng)態(tài)文件名的時(shí)候使用到這些屬性闻坚。這里面比較重要的屬性比如:msg(消息體)、hostname兢孝、pri(消息等級(jí)和類別)窿凤、time(時(shí)間有關(guān)),屬性的名稱中以是從消息中獲得變量雳殊。
屬性替代的語(yǔ)法格式:
%propname:fromChar:toChar:options:fieldname%
屬性替換的功能很強(qiáng)大,你可以使用起始字符獲取自己所需的字段窗轩,也可以使用正則表達(dá)式夯秃,也可以使用分隔符。舉幾個(gè)例子:為了兼容一個(gè)rfc協(xié)議品姓,rsyslog規(guī)定如果用戶輸入的msg不是以空格開頭寝并,rsyslog會(huì)自動(dòng)補(bǔ)充一個(gè)空格箫措,因此如果你希望輸出的時(shí)候去掉這個(gè)空格腹备,就可以使用:
%msg:2:$%
選取msg變量中,起始位置為2斤蔓,終止位置為結(jié)尾我們經(jīng)常需要根據(jù)空格來分析字符串植酥,F(xiàn)表示使用字符分割,32是空格的ascii碼。 按照空格分隔友驮,取第三個(gè)子串漂羊,例:
%msg:F,32:3%模板
模板的功能是定義輸出格式,或者定義omfile模塊的動(dòng)態(tài)路徑卸留、動(dòng)態(tài)文件走越。需要使用上面提到的屬性替換。
模板定義的形式有四種耻瑟,適用于不同的輸出模塊旨指,一般簡(jiǎn)單的格式,可以使用string
的形式喳整,復(fù)雜的格式谆构,建議使用list
的形式,使用list
的形式框都,可以使用一些額外的屬性字段(property statement)搬素,例如:position.from
、position.end
魏保。
如果不指定輸出模板熬尺,rsyslog會(huì)默認(rèn)使用RSYSLOG_DEFAULT
。
如果你只想輸出msg谓罗,可以定義模板
template f_debug, “/data0/logs/%
month%-%$day%/debug.log”
-
Ruleset
Ruleset實(shí)現(xiàn)的是多實(shí)例的功能皂吮,可以針對(duì)syslog的來源使用不同的過濾規(guī)則。需要注意的是税手,在配置文件中需要先定義ruleset蜂筹,才可以使用。比較典型的一個(gè)例子芦倒,針對(duì)不同的端口使用不同的過濾規(guī)則艺挪。$Ruleset tcp1999 $RulesetCreateMainQueue on Local3.* @@10.0.0.44:1999 $Ruleset tcp2000 $RulesetCreateMainQueue on Local4.* @@10.0.0.44:2000
在定義好ruleset后,各個(gè)輸出模塊就可以指定自己使用的ruleset了兵扬,具體如何指定麻裳,可以查看輸出模塊的手冊(cè),一般會(huì)有一個(gè)ruleset的參數(shù)器钟,用來實(shí)現(xiàn)這個(gè)功能津坑。
- Filter模塊
Rsyslog可以使用syslog標(biāo)準(zhǔn)的過濾規(guī)則,同時(shí)自己添加了一些擴(kuò)展傲霸。比如可以在輸出中指定rsyslog自己的處理方式疆瑰,可以指定輸出template,方法是在規(guī)則后面添加template的名字眉反,用分號(hào)隔開。
例如我們可以編寫一個(gè)規(guī)則
Local3.* -/data0/logs/local3.log;t_msg
#在這個(gè)輸出中使用t_msg的模板
Local4.* -?f_local3_test;t_msg
問號(hào)表示要使用模板定義的動(dòng)態(tài)路徑.
除了syslog標(biāo)準(zhǔn)的規(guī)則穆役,rsyslog的作者還自己開發(fā)了一個(gè)叫做rainerscript的腳本語(yǔ)言寸五,來定義更復(fù)雜的過濾過則,rainerscript 可以對(duì)屬性進(jìn)行startwith
耿币、contains
梳杏、%
(取余)等過濾規(guī)則,例如
Ifmsg contains “abc” then{ #pri為local3淹接,且在消息中包含子串‘a(chǎn)bc’
. -/data0/logs/local3.log;t_msg
}
還有第三種方式是使用屬性的表示方式秘狞,例如
:msg, regex, "^ [g-z]" /root/rsyslog_worker_dir/2000.log
# 以字母g到z開頭的消息,注意msg開頭有個(gè)空格 - 隊(duì)列
隊(duì)列是rsyslog中比較重要的一個(gè)部分蹈集,作為使用者烁试,我們需要了解的是隊(duì)列的種類:主隊(duì)列 和 工作隊(duì)列。從輸入模塊接收的消息會(huì)進(jìn)入主隊(duì)列拢肆,主隊(duì)列中的消息减响,經(jīng)過過濾模塊,會(huì)進(jìn)入到相應(yīng)的工作隊(duì)列郭怪;隊(duì)列的四種工作模式:direct mode支示、disk mode、FixedArray mode 和 LinkedList mode鄙才,前兩種是磁盤隊(duì)列颂鸿,更可靠,但是性能也較差攒庵,后兩種是內(nèi)存隊(duì)列嘴纺,區(qū)別是前者是預(yù)分配隊(duì)列長(zhǎng)度,后者是動(dòng)態(tài)分配浓冒,如果你的系統(tǒng)日志流量比較平穩(wěn)栽渴,可以使用預(yù)分配隊(duì)列,如果日志屬于突發(fā)型稳懒,可以使用動(dòng)態(tài)隊(duì)列闲擦。此外,內(nèi)存隊(duì)列還可以通過指定一個(gè)queuename來添加DA模式场梆,DA模式主要是為了防止意外情況(進(jìn)程關(guān)閉墅冷、server端宕機(jī))下,內(nèi)存隊(duì)列可以不丟失或油。
通過查看rsyslog的系統(tǒng)命令寞忿,可以知道rsyslog對(duì)隊(duì)列進(jìn)行大量的可配參數(shù),來定義隊(duì)列的行為装哆」藜梗可以根據(jù)需要來進(jìn)行優(yōu)化定嗓。