1. 程式人生 > >rsyslog——第二章 rsyslog的概念

rsyslog——第二章 rsyslog的概念

第二章 rsyslog的概念

2.1屬性替代
Rsyslog 預定義了一些屬性,來代表訊息中的資訊,我們可以在定義輸出格式、動態檔名的時候使用到這些屬性。這裡面比較重要的屬性比如:msg(訊息體)、hostname、pri(訊息等級和類別)、time(時間有關),屬性的名稱中以$開頭的是從本地系統獲得的變數、不帶$是從訊息中獲得變數。
屬性替代的語法格式:
  1. %propname:fromChar:toChar:options:fieldname%
複製程式碼
屬性替換的功能很強大,你可以使用起始字元獲取自己所需的欄位,也可以使用正則表示式,也可以使用分隔符。舉幾個例子:為了相容一個rfc協議,rsyslog規定如果使用者輸入的msg不是以空格開頭,rsyslog會自動補充一個空格,因此如果你希望輸出的時候去掉這個空格,就可以使用


  1. %msg:2:$%  
複製程式碼
  #選取msg變數中,起始位置為2,終止位置為結尾我們經常需要根據空格來分析字串,F表示使用字元分割,32是空格的ascii碼,例:

  1. %msg:F,32:3%
複製程式碼
  #按照空格分隔,取第三個子串,正則匹配可以匹配特定的文字和格式,我的正則比較差, 避免了使用這部分的內容,所以這部分沒有例子了。

屬性替代中還用到了一類特殊的以$!開頭的變數,這是使用mmnormalize模組時特有的,可以實現類似於syslog-ng中parser模組的功能。後面再講

2.2模板

模板的功能是定義輸出格式,或者定義omfile模組的動態路徑、動態檔案。需要使用上面提到的屬性替換。

模板定義的形式有四種,適用於不同的輸出模組,一般簡單的格式,可以使用string的形式,複雜的格式,建議使用list的形式,使用list的形式,可以使用一些額外的屬性欄位(property statement),例如:position.from、position.end。

如果不指定輸出模板,rsyslog會預設使用RSYSLOG_DEFAULT。

如果你只想輸出msg,可以定義模板

  1. $template  t_msg, “%msg\n%”
複製程式碼
如果想按日期儲存輸出,需要使用動態路徑。可以定義模板

  1. $template  f_debug, “/data0/logs/%$year%-%$month%-%$day%/debug.log”
  2. 2.3Ruleset
複製程式碼
Ruleset實現的是多例項的功能,可以針對syslog的來源使用不同的過濾規則。需要注意的是,在配置檔案中需要先定義ruleset,才可以使用。比較典型的一個例子,針對不同的埠使用不同的過濾規則。

  1. $Ruleset tcp1999
  2. $RulesetCreateMainQueue on
  3. Local3.*      @@10.0.0.44:1999
  4. $Ruleset tcp2000
  5. $RulesetCreateMainQueue on
  6. Local4.*      @@10.0.0.44:2000
複製程式碼

在定義好ruleset後,各個輸出模組就可以指定自己使用的ruleset了,具體如何指定,可以檢視輸出模組的手冊,一般會有一個ruleset的引數,用來實現這個功能。

2.4Filter模組

Rsyslog可以使用syslog標準的過濾規則,同時自己添加了一些擴充套件。比如可以在輸出中指定rsyslog自己的處理方式,可以指定輸出template,方法是在規則後面新增template的名字,用分號隔開。

例如我們可以編寫一個規則

  1. Local3.*    -/data0/logs/local3.log;t_msg
複製程式碼
#在這個輸出中使用t_msg的模板

  1. Local4.*    -?f_local3_test;t_msg     
複製程式碼
#問號表示要使用模板定義的動態路徑
除了syslog標準的規則,rsyslog的作者還自己開發了一個叫做rainerscript的指令碼語言,來定義更復雜的過濾過則,rainerscript可以對屬性進行startwith、contains、%(取餘)等過濾規則,例如

  1. If $pri-txt == local3.* and $msg contains “abc” then{  #pri為local3,且在訊息中包含子串‘abc’
  2.        *.*   -/data0/logs/local3.log;t_msg
  3. }
複製程式碼
還有第三種方式是使用屬性的表示方式,例如

  1. :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對佇列進行大量的可配引數,來定義佇列的行為。可以根據需要來進行優化。