rsyslog——第二章 rsyslog的概念
阿新 • • 發佈:2019-02-06
第二章 rsyslog的概念
2.1屬性替代
Rsyslog 預定義了一些屬性,來代表訊息中的資訊,我們可以在定義輸出格式、動態檔名的時候使用到這些屬性。這裡面比較重要的屬性比如:msg(訊息體)、hostname、pri(訊息等級和類別)、time(時間有關),屬性的名稱中以$開頭的是從本地系統獲得的變數、不帶$是從訊息中獲得變數。
屬性替代的語法格式:
屬性替換的功能很強大,你可以使用起始字元獲取自己所需的欄位,也可以使用正則表示式,也可以使用分隔符。舉幾個例子:為了相容一個rfc協議,rsyslog規定如果使用者輸入的msg不是以空格開頭,rsyslog會自動補充一個空格,因此如果你希望輸出的時候去掉這個空格,就可以使用
#選取msg變數中,起始位置為2,終止位置為結尾我們經常需要根據空格來分析字串,F表示使用字元分割,32是空格的ascii碼,例:
#按照空格分隔,取第三個子串,正則匹配可以匹配特定的文字和格式,我的正則比較差, 避免了使用這部分的內容,所以這部分沒有例子了。
屬性替代中還用到了一類特殊的以$!開頭的變數,這是使用mmnormalize模組時特有的,可以實現類似於syslog-ng中parser模組的功能。後面再講
2.2模板
模板的功能是定義輸出格式,或者定義omfile模組的動態路徑、動態檔案。需要使用上面提到的屬性替換。
模板定義的形式有四種,適用於不同的輸出模組,一般簡單的格式,可以使用string的形式,複雜的格式,建議使用list的形式,使用list的形式,可以使用一些額外的屬性欄位(property statement),例如:position.from、position.end。
如果不指定輸出模板,rsyslog會預設使用RSYSLOG_DEFAULT。
如果你只想輸出msg,可以定義模板
如果想按日期儲存輸出,需要使用動態路徑。可以定義模板
Ruleset實現的是多例項的功能,可以針對syslog的來源使用不同的過濾規則。需要注意的是,在配置檔案中需要先定義ruleset,才可以使用。比較典型的一個例子,針對不同的埠使用不同的過濾規則。
在定義好ruleset後,各個輸出模組就可以指定自己使用的ruleset了,具體如何指定,可以檢視輸出模組的手冊,一般會有一個ruleset的引數,用來實現這個功能。
2.4Filter模組
Rsyslog可以使用syslog標準的過濾規則,同時自己添加了一些擴充套件。比如可以在輸出中指定rsyslog自己的處理方式,可以指定輸出template,方法是在規則後面新增template的名字,用分號隔開。
例如我們可以編寫一個規則
#在這個輸出中使用t_msg的模板
#問號表示要使用模板定義的動態路徑
除了syslog標準的規則,rsyslog的作者還自己開發了一個叫做rainerscript的指令碼語言,來定義更復雜的過濾過則,rainerscript可以對屬性進行startwith、contains、%(取餘)等過濾規則,例如
還有第三種方式是使用屬性的表示方式,例如
#以字母g到z開頭的訊息,注意msg開頭有個空格
2.5佇列
佇列是rsyslog中比較重要的一個部分,作為使用者,我們需要了解的是佇列的種類:主佇列和工作佇列。從輸入模組接收的訊息會進入主佇列,主佇列中的訊息,經過過濾模組,會進入到相應的工作佇列;佇列的四種工作模式:direct mode、disk mode、FixedArray mode和LinkedList mode,前兩種是磁碟佇列,更可靠,但是效能也較差,後兩種是記憶體佇列,區別是前者是預分配佇列長度,後者是動態分配,如果你的系統日誌流量比較平穩,可以使用預分配佇列,如果日誌屬於突發型,可以使用動態佇列。此外,記憶體佇列還可以通過指定一個queuename來新增DA模式,DA模式主要是為了防止意外情況(程序關閉、server端宕機)下,記憶體佇列可以不丟失。
通過檢視rsyslog的系統命令,可以知道rsyslog對佇列進行大量的可配引數,來定義佇列的行為。可以根據需要來進行優化。
2.1屬性替代
Rsyslog 預定義了一些屬性,來代表訊息中的資訊,我們可以在定義輸出格式、動態檔名的時候使用到這些屬性。這裡面比較重要的屬性比如:msg(訊息體)、hostname、pri(訊息等級和類別)、time(時間有關),屬性的名稱中以$開頭的是從本地系統獲得的變數、不帶$是從訊息中獲得變數。
屬性替代的語法格式:
- %propname:fromChar:toChar:options:fieldname%
屬性替換的功能很強大,你可以使用起始字元獲取自己所需的欄位,也可以使用正則表示式,也可以使用分隔符。舉幾個例子:為了相容一個rfc協議,rsyslog規定如果使用者輸入的msg不是以空格開頭,rsyslog會自動補充一個空格,因此如果你希望輸出的時候去掉這個空格,就可以使用
- %msg:2:$%
#選取msg變數中,起始位置為2,終止位置為結尾我們經常需要根據空格來分析字串,F表示使用字元分割,32是空格的ascii碼,例:
- %msg:F,32:3%
#按照空格分隔,取第三個子串,正則匹配可以匹配特定的文字和格式,我的正則比較差, 避免了使用這部分的內容,所以這部分沒有例子了。
屬性替代中還用到了一類特殊的以$!開頭的變數,這是使用mmnormalize模組時特有的,可以實現類似於syslog-ng中parser模組的功能。後面再講
2.2模板
模板的功能是定義輸出格式,或者定義omfile模組的動態路徑、動態檔案。需要使用上面提到的屬性替換。
模板定義的形式有四種,適用於不同的輸出模組,一般簡單的格式,可以使用string的形式,複雜的格式,建議使用list的形式,使用list的形式,可以使用一些額外的屬性欄位(property statement),例如:position.from、position.end。
如果不指定輸出模板,rsyslog會預設使用RSYSLOG_DEFAULT。
如果你只想輸出msg,可以定義模板
- $template t_msg, “%msg\n%”
如果想按日期儲存輸出,需要使用動態路徑。可以定義模板
-
$template f_debug, “/data0/logs/%$year%-%$month%-%$day%/debug.log”
- 2.3Ruleset
Ruleset實現的是多例項的功能,可以針對syslog的來源使用不同的過濾規則。需要注意的是,在配置檔案中需要先定義ruleset,才可以使用。比較典型的一個例子,針對不同的埠使用不同的過濾規則。
-
$Ruleset tcp1999
-
$RulesetCreateMainQueue on
-
Local3.* @@10.0.0.44:1999
-
$Ruleset tcp2000
-
$RulesetCreateMainQueue on
- Local4.* @@10.0.0.44:2000
在定義好ruleset後,各個輸出模組就可以指定自己使用的ruleset了,具體如何指定,可以檢視輸出模組的手冊,一般會有一個ruleset的引數,用來實現這個功能。
2.4Filter模組
Rsyslog可以使用syslog標準的過濾規則,同時自己添加了一些擴充套件。比如可以在輸出中指定rsyslog自己的處理方式,可以指定輸出template,方法是在規則後面新增template的名字,用分號隔開。
例如我們可以編寫一個規則
- Local3.* -/data0/logs/local3.log;t_msg
#在這個輸出中使用t_msg的模板
- Local4.* -?f_local3_test;t_msg
#問號表示要使用模板定義的動態路徑
除了syslog標準的規則,rsyslog的作者還自己開發了一個叫做rainerscript的指令碼語言,來定義更復雜的過濾過則,rainerscript可以對屬性進行startwith、contains、%(取餘)等過濾規則,例如
-
If $pri-txt == local3.* and $msg contains “abc” then{ #pri為local3,且在訊息中包含子串‘abc’
-
*.* -/data0/logs/local3.log;t_msg
- }
還有第三種方式是使用屬性的表示方式,例如
- :msg, regex, "^ [g-z]" /root/rsyslog_worker_dir/2000.log
#以字母g到z開頭的訊息,注意msg開頭有個空格
2.5佇列
佇列是rsyslog中比較重要的一個部分,作為使用者,我們需要了解的是佇列的種類:主佇列和工作佇列。從輸入模組接收的訊息會進入主佇列,主佇列中的訊息,經過過濾模組,會進入到相應的工作佇列;佇列的四種工作模式:direct mode、disk mode、FixedArray mode和LinkedList mode,前兩種是磁碟佇列,更可靠,但是效能也較差,後兩種是記憶體佇列,區別是前者是預分配佇列長度,後者是動態分配,如果你的系統日誌流量比較平穩,可以使用預分配佇列,如果日誌屬於突發型,可以使用動態佇列。此外,記憶體佇列還可以通過指定一個queuename來新增DA模式,DA模式主要是為了防止意外情況(程序關閉、server端宕機)下,記憶體佇列可以不丟失。
通過檢視rsyslog的系統命令,可以知道rsyslog對佇列進行大量的可配引數,來定義佇列的行為。可以根據需要來進行優化。