Rsyslogd 配置[通俗易懂]
Rsyslogd 配置
一般的,Rsyslogd的配置文件在/etc/rsyslog.conf。
配置文件格式
有3種格式的配置文件
- basic 基礎配置格式,兼容syslog.conf格式
- advanced 以前叫RainerScript格式,在rsyslog v6開始使用
- obsolete legacy 傳統(tǒng)的格式,僅為確保舊有配置不會出錯
需要用哪種格式
強烈建議不要使用傳統(tǒng)格式,應在基礎配置中使用使用basic格式,在其它情況下使用advanced格式。
basic格式一般由簡單語句組成,看起來像這樣:
mail.info /var/log/mail.log
mail.err @@server.example.net
advanced格式有以下好處:
- 可以通過高級選項參數(shù)更容易控制rsyslog的操作
- 塊結構化配置
- 容易書寫
- 可以使用include
看起來是這樣的:
mail.err action(type="omfwd" protocol="tcp" queue.type="linkedList")
sysklogd格式
也就是basic格式,以#開頭的行以及空行直接被忽略,注釋還可以用類C語言的/* */。
這種配置格式由logging規(guī)則(rules)組成。每條規(guī)則包括兩部分:selector和action。這兩部分由多個空格或TAB分隔。selector字段指定特定類型(facility)和優(yōu)先級(priority)以關聯(lián)相應的action。
SELECTORS
selector字段由兩部分組成,facility和priority,由”.”分隔。各部分均為大小寫無關,且都可以由對應的10進制數(shù)替代,參見(/usr/include/syslog.h)。
facility由下列類型組成:auth, authpriv, cron, daemon, ftp, kern, lpr, mail, mark, news, security (auth), syslog, user, uucp, local0 – local7。其中security 不建議使用,只作內(nèi)部用途。
priority由下列組成,按重要程序升序排列:debug, info, notice, warning, warn (warning), err, error (err), crit, alert, emerg, panic (emerg)
rsyslog將記錄指定priority以及更高的日志到指定action。
同時*表明任意facility和priority,具體含義取決于*出現(xiàn)在”.”的前面或后面。關鍵字none表示指定facility無priority。
在同一行可以用”,”分隔多個facility并指定同一priority。
在同一行中可以用”;”分隔多個selector采用同一action。多個selector將以從左至右的順序處理,每一selector可以覆蓋之前的selector。一般用這種方式來指定pattern中需要排除的一部分。
可以在priority前加上”=”,來指定rsyslog僅記錄該級別的priority,而更高級別的被忽略。
可以在priority前加上”!”,來指定rsyslog忽略該級別及更高級別的priority。
以上的”=“和”!“可以聯(lián)用,來指定僅忽略該級別的priority,注意必須是”!=”這樣的順序。
ACTIONS
action字段是rule中l(wèi)ogfile的抽象描述。logfile不必是個真實文件。其可以是以下類型:
-
Regular File 常規(guī)文件
文件名必須指定絕對路徑。
可以在文件名前加上”-“,來避免每條log就同步一次文件。
-
Named Pipes 命名管道
fifo或命名管道可以在文件名前加上管道符號”|”。fifo必須在rsyslogd啟動前由mkfifo創(chuàng)建。
-
Terminal and Console 終端
可以用設備名指定tty,如/dev/console。
-
Remote Machine 遠程服務器
在主機名前加上”@”。
-
List of Users 指定用戶
一般critical消息會同時轉發(fā)到本機的”root”用戶。同樣可以將需要的日志發(fā)送到指定用戶的終端上。可以用”,”分隔用戶名列表。如果這些用戶已登錄系統(tǒng),將會收到log消息。
-
Everyone logged on 所有已登錄用戶
緊急消息用來通知當前在線用戶有奇怪的事情發(fā)生。這樣的消息action以”*”指定即可。
處理流程
- 輸入模塊將收到的消息提交到ruleset
- 若未綁定ruleset,則使用默認ruleset
- 默認會有一個ruleset(RSYSLOG_DefaultRuleset)
- 額外的ruleset可以用戶自定義
- 每個ruleset包括0條或更多rule
- 允許在ruleset內(nèi)部為0條rule則顯然沒有任何作用
- 每條rule由一個filter和一個action list組成
- filter提供yes/no決策和流控
- 若filter命中,則對應的action list被執(zhí)行,否則,不發(fā)生任何事
- 在指定ruleset內(nèi)的rule會按順序依次檢查。無關聯(lián)的ruleset中的rule將不會被檢查。
- 所有rule都將被檢查,不管是否已有filter命中(因此不會在首次命中后停止檢查)。如果希望停止,則需要明確指定”discard”這個action(由”~”或stop命令表示)。如果丟棄action被執(zhí)行,則消息不再繼續(xù)進行下一rule的檢查。
- 每個action list包含一條或多條action
- 在action list內(nèi)部,不能包括更多的filter
- 要在list里包含超過一條action,后續(xù)action每條占一行,原來filter的位置要改為”&”,并且此行要緊跟上一action。
- action由action調(diào)用本身(比如: :omusrmsg:)以及所有action定義配置語句($Actin…指示)組成
- 所有$開頭的語句均為legacy配置,具體不深入探究
FILTER
Property-based Filters
除了之前描述的傳統(tǒng)selector外rsyslogd還支持基于屬性的filter: Property-based Filters。
可以使用任意屬性,如HOSTNAME, syslogtag以及msg這些。所有支持的屬性列表詳見rsyslog properties documentation
這種filter有如下形式:
:property, [!]compare-operation, "value"
以”:“開頭,緊跟屬性名,再跟個”,”,比較操作名,再一個”,”,然后是要比較的值。值必須加雙引號””。 在這些”,“之間可以有空格和TAB。屬性名/比較操作,都是大小寫相關,所以”msg”可以用,但”MSG”則是非法屬性名。比較操作前的”!”表達結果相反。
比較操作列表如下:
- contains 包含
- isequal 相等
- startswith 以此開頭
- regex BRE正則表達式
- ereregex ERE正則表達式
值部分必須是帶””的字符串,可以有兩種轉義符:
- \” – 引號本身
- \\ – 反斜杠
Expression-Based Filters
Filter還可以基于任意復雜的表達式,可以包含布爾值,數(shù)學和字符串操作。表達式可以進化為完整的配置腳本語言。不幸的是,這些語法仍在完善中,可能會有后續(xù)的修改。因此,如果你現(xiàn)在就用,今后很有可能需要修改配置。
基于表達式的filter由新一行的”if”開頭。看起來像這樣:
if expr then action-part-of-selector-line
“if” 和 “then” 是固定關鍵字必須存在。 “expr”是表達式,詳見:expression documentation。”action-part-of-selector-line”則是通常的action(如 /var/log/logfile)。
Tempaltes 模板
模板是rsyslog的關鍵特性。此特性允許用戶自定義任意格式。同時也可用于動態(tài)文件名的生成。
模板用template()語句指定,也可由傳統(tǒng)語法$template語句指定。
template() 語句
template()語句是static靜態(tài)的語句,意思是所有模板在rsyslog讀入config文件時被定義,無法被if語句影響。
基本語法如下:
template(parameters)
此外,列表式模板支持擴展語法:
template(parameters) { list-descriptions }
每個模板有一個參數(shù)name,其指定了模板名稱,以及參數(shù)type,其指定了模板類型。name參數(shù)必須唯一,否則結果無法預測。type參數(shù)指定了模板的不同類型。不同的類型可以用不同的方式定義模板內(nèi)容。模板類型并不會影響(output)plugin如果處理該內(nèi)容。因此,按最適合你需求的方式(從編寫配置的視角而言)來使用type類型。以下是可用的類型:
- list
- subtree
- string
- plugin
以下分別描述這些類型。
List
在這種情況下,模板由一組常量(constant)語句和可變語句生成。這組列表在花括號”{}”跟在template定義后。此類型主要用于結構化的輸出,如ommongodb。當然也可以完美的工作于基于文本的輸出中。一般建議在需要復雜屬性替換時使用此類型。這種情況下,基于列表的模板語法會比簡單的基于字符串方式更清晰。
列表模板包括模板頭(type=“l(fā)ist”),跟著是用花括號包圍的表明從屬此模板的constant和property語句。從名字可以看出,constant語句描述了固定常量文本字義,而property描述了屬性值的訪問。后面會講到property有很多選項。大多數(shù)選項用于從屬性中抽取一部分內(nèi)容或改變獲取的內(nèi)容(例如改變大小寫等)。
來個實際的例子:
template(name="tpl1" type="list") {
constant(value="Syslog MSG is: '")
property(name="msg")
constant(value="', ")
property(name="timereported" dateFormat="rfc3339" caseConversion="lower")
constant(value="\n")
}
這個例子或許主要用于常見的基于文件的輸出。
Constant 語句
這是用于指定常量文本的方式。文本按字面使用。一般面向基于文本的輸出。例如,復雜模板構建時,經(jīng)常會在末尾添加換行,這時即可以用constant語句。舉個例子:
template(name="outfmt" type="list") {
property(name="$!usr!msgnum")
constant(value="\n")
}
下列是所有在常量文本內(nèi)可識別的轉義字符序列:
- \\ – 單個反斜杠
- \n – 換行
- \ooo – (3個八進制數(shù)字) – 表示有此值的字符(如:\101表示’A’)。注意,必須是3個數(shù)字。這里雖然支持八進制記號,但建議使用下列更易理解的十六進制方式。
- \xhh – (這里h是十六進制數(shù)字) – 表示有此值的字符(如:\x41表示’A’)。注:兩個十六進制數(shù)必須都給出(一些語言里可能1個或2個數(shù)字都支持)。
注:若在反斜杠后跟了未支持的字符,將認為是錯誤。行為不可預料。
在一些基于文本和基于結構使用同一個模板的情況下,沒有”outname”參數(shù)的常量文本在創(chuàng)建name/value樹結構化輸出時會被忽略。因此,若希望向類似mongodb提供常量文本時,必須包括outname,例如:
template(name="outfmt" type="list") {
property(name="$!usr!msgnum")
constant(value="\n" outname="IWantThisInMyDB")
}
要生成常量的json字段,format字段要指定為”jsonf”,例如:
template(name="outfmt" type="list" option.jsonf="on") {
property(outname="message" name="msg" format="jsonf")
constant(outname="@version" value="1" format="jsonf")
}
在這個例子中,constant語句會生成”@version”:“1”。注意,要達到這個效果,value和format參數(shù)都必須給出。
constant語句支持下列參數(shù):
- value – 將使用的常量值
- outname – 輸出字段名(結構化輸出時)
- format – 可以為空或是jsonf
Property 語句
此語句用于包含property屬性文本。可以訪問所有可用屬性。屬性列表詳見rsyslog properties documentation
可以用選項指定選取部分或改變屬性。支持下列參數(shù):
- name – 要訪問的屬性名
- outname – 輸出字段名(結構化輸出時)
- dateformat – Date格式。這里是所有property的選項
要生成自定義格式,可以用多個property選項。例如要生成YYYY-MM-DD:
property(name="timereported" dateformat="date-year")
constant(value="-")
property(name="timereported" dateformat="date-month")
constant(value="-")
property(name="timereported" dateformat="date-day")
其余參數(shù)參見官網(wǎng)
Subtree 子樹
這種情況下,模板基于完整的(CEE)子樹。這種模板最常用于輸出模塊知道如何處理結構樹,如ommongodb。例如template(name=”tpl1” type=”subtree” subtree=” ! ” ) 包 括 了 所 有 C E E 數(shù) 據(jù) , 而 t e m p l a t e ( n a m e = ” t p l 2 ” t y p e = ” s u b t r e e ” s u b t r e e = ” !”)包括了所有CEE數(shù)據(jù),而template(name=”tpl2” type=”subtree” subtree=” !”)包括了所有CEE數(shù)據(jù),而template(name=”tpl2”type=”subtree”subtree=”!usr!tpl2”)僅包括從$!usr!tpl2開始的子樹。當使用此類型模板時,所有數(shù)據(jù)必須用set和unset腳本語句預先構造好。要了解詳情,參見官網(wǎng),這里只舉個例子:
set $!usr!tpl2!msg = $msg;
set $!usr!tpl2!dataflow = field($msg, 58, 2);
template(name="tpl2" type="subtree" subtree="$!usr!tpl2")
String 字符串
最接近于傳統(tǒng)模板定義的語句。其有必須的參數(shù)string,其中包含了將被應用于模板的字符串。模板字符串混合了常量文本和替換變量(見Property替換)。這些變量從消息或其它動態(tài)內(nèi)容中獲得。基于字符串的模板可以很容易指定文本內(nèi)容,特別是沒有復雜屬性需要處理的情況下。
以下是示例:
template(name="tpl3" type="string"
string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
)
在’%’之間的文本由rsyslog的property替換來處理。簡單來說,其包含了屬性及其格式化選項。其與list模板中的property對象類似,僅是兩種不同的表達方式而已。
在’%’之外的所有內(nèi)容均為常量文本。
Plugin 插件
這種模板由插件(所以一般叫作”strgen”或”字符串生成器”)。由于是編程實現(xiàn),所以格式是固定的。由于是不可變的,因此性能上會好很多,并且一般都是因此而使用(并不是說常規(guī)模板性能就很差-而是在特定的要求超高的情況下,很可能1比特的性能差距也很關鍵)。具體詳情需要查看具體插件的文檔。必須指定plugin參數(shù),且必須包含插件名以表明自身。注意該插件必須在使用之前加載。同樣舉個例子:
template(name="tpl4" type="plugin" plugin="mystrgen")
創(chuàng)建動態(tài)文件名示例
模板可用于生成動態(tài)文件名。例如,當希望將syslog按不同主機名分別寫到不同文件時(每臺主機一個文件),你可以如下定義模板:
template (name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")
保留模板名
所有”RSYSLOG_”開頭的模板名都被保留給rsyslog使用。請不要在配置中使用它們,否則將有可能在未來導致沖突。
總結
以上是生活随笔為你收集整理的Rsyslogd 配置[通俗易懂]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果红外感应头是什么(这是什么情况)
- 下一篇: gta5恐霸有什么用