Rsyslog初步學習

1、Rsyslog總體架構 

Rsyslog消息流:輸入模塊——>預處理模塊——>主隊列——>過濾模塊——>執行隊列——>輸出模塊正則表達式

1. 輸入模塊

  輸入模塊是消息來源數據庫

 

 

2. 預處理模塊

  主要解決各類syslog協議實現間的差別後端

3. 隊列模塊

  負責消息的存儲,從Input傳入的未通過濾的消息放在主隊列,過濾後的消息放入到不一樣的action queue中,再由執行隊列送到各個輸出模塊多線程

 

4. 過濾模塊

  Filter模塊處理消息的分析和過濾,rsyslog能夠對消息的任何部分進行過濾架構

 

5. 輸出模塊

  消息的目的地框架

 

 

 

6. rsyslog命令的參數

7. 其餘概念

基本結構:數據流動過程當中內置的基本處理框架,可是對於消息流,是能夠高度定製化的。定製工做是經過自定義rsyslog對象來完成的。tcp

消息流和對象概覽:消息經過input模塊進入rsyslog,接着到ruleset,進行規則匹配,也就是作一些處理,好比寫到文件,數據庫或者繼續轉發到遠程主機。性能

處理原則:每一個ruleset會包含>=0個規則,一條規則包含一個過濾器和一個動做列表,一個動做列表會包含一個或多個動做測試

過濾器:控制流量,動做列表不會再出現過濾器spa

處理順序:rsyslog.conf中得命令是從上到下一次執行的,因此,若是你中止了對某消息的處理,那麼這行以後的命令就不會再被檢查和執行了

流程控制語句

if expr then ... else ...- 條件語句

stop - 中止處理當前消息

call - 調用一個rulese(相似子程序調用)

continue - 一個空操做(NOP),頗有用。好比在if語句的then部分

 

流控制也能夠經過過濾器條件來實現

數據操做語言

set - 設置一個用戶變量

unset - 刪除以前設置的用戶變量

2、Rsyslog的做用

  • 接收來自多種源的輸入
  • 傳輸接收的內容
  • 輸出到不一樣類型的目的端

3、Rsyslog的特徵

  • 多線程
  • TCP/SSL/TLS/RELP
  • MySQL/PostgreSQL/Oracle等
  • 對syslog日誌的任何部分進行篩選和過濾
  • 徹底可控的輸出格式
  • 適合企業級的日誌系統

4、 rsyslog配置相關概念

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. 模板(詳細使用見Rsyslog模板文章)

功能

(1)定義輸出的格式

(2)定義omfile模塊的動態路徑、動態文件。須要用到屬性替換

形式

(1)通常簡單格式,可使用string的形式

(2)複雜的格式,可以使用list形式

(3)子樹(subtree)

(4)插件(plugin)

3. Ruleset(規則集)

(1)實現多實例功能

(2)針對syslog的來源使用不一樣的過濾規則

(3)須要在配置文件中先定義ruleset,纔可使用

舉例:針對不一樣端口使用不一樣的過濾規則

#定義規則:以local3開頭的全部日誌發送到10.0.0.44的1999端口,以local4開頭的日誌發送到10.0.0.44的2000端口

$Ruleset    tcp1999

$RulesetCreateMainQueue on

Local3.*    @@10.0.0.44:1999

#定義規則2 相似於上

$Ruleset    tcp2000

$RulesetCreateMainQueue on

Local4.*    @@10.0.0.44:2000

 

4. Filter模塊

  rsyslog可以使用rsyslog標準的過濾規則,同時本身添加了一些擴展。好比在輸出中指定rsyslog本身的處理方式,能夠指定輸出模板(template)

  使用方法:在規則(ruleset)後面添加模板的名字,用分號隔開

  舉例:

#第一種方式:將local3.*的日誌保存到所指目錄中,輸出處理使用t_msg模塊

Local3.*    -/data0/logs/local3.log;t_msg


#?問號表示使用模板定義的動態路徑

Local4.*    -?f_local3_test;t_msg

#第二種方式

#除了syslog標準的規則,rsyslog的做者還本身開發了一個叫作rainerscript的腳本語言,來定義更復雜的過濾規則,rainerscript能夠對

#屬性進行startwith、contains、%(取餘)等過濾規則

if $pri-txt == local3.* and $msg contains "abc" then {

    *.* -/data0/logs/local3.log;t_msg

}

#這個例子表示若是pri是local3,且在消息中包含子串‘abc’
 #第三種方式:使用屬性的表示方式

:msg, regex, "^ [g-z]"  /root/rsyslog_worker_dir/2000.log   #以字母g到z開頭的消息,注意msg開頭有空格

5. 隊列

隊列的種類:主隊列和工做隊列。從輸入模塊進入主隊列;主隊列的消息,通過過濾模塊,進入到相應的工做隊列隊列的四種工做模式。

隊列的四種工做模式

 

此外,內存隊列還能夠經過指定一個queuename來添加DA模式,DA模式主要是爲了防止意外狀況(進程關閉,server端宕機)下,內存隊列能夠不丟失。

關於隊列的配置:

由於 MainMsgQueue 和 ActionQueue 的配置基本同樣(除了有些默認值可能不一樣), 因此這裏以MainMsgQueue 爲例:

$MainMsgQueueType [FixedArray/LinkedList/Direct/Disk]

$MainMsgQueueFileName <name>                 #針對disk queue的配置,定義隊列名,存儲隊列數據時用的文件名就是這個名稱

MainMsgQueueCheckpointInterval <number>           #針對disk queue的配置,單位條數,設置在檢查點寫入相關信息,增長可靠性,可是會下降性能

$MainMsgQueueDequeueBatchSize <number> [default 32]     #設置多少條隊列做爲一個batch一塊兒出隊,針對一個日誌量很大的系統,能夠考慮把這個值調高來增長性能,不過要結合可以使用內存考慮實際狀況

 

對於DA隊列,最有特色就是隊列閾值的設置了。主要包括這幾個配置:

$MainMsgQueueSize                       #設置隊列的最大大小

$MainMsgQueueDiscardMark <number> [default 9750]     #配合下面的 $MainMsgQueueDiscardSeverity,超過這個watermark後,不重要的日誌都會丟棄,包括新進來和已經在隊列裏的

$MainMsgQueueDiscardSeverity <severity> [default 4 (warning)] 0-Emergency, 1-Alert, 2-Critical, 3-Error, 4-Warning, 5-Notice, 6-Informational, 7-Debug

$MainMsgQueueHighWaterMark <number> [default 8000]     #設置 high watermark

$MainMsgQueueLowWaterMark <number> [default 2000]     #設置 low watermark

$MainMsgQueueMaxFileSize <size_nbr> [default 1m]       #針對disk狀況下,單個文件的最大大小

$MainMsgQueueMaxDiskSpace                     #控制佔用硬盤總空間大小

 

DA 對於閾值處理的邏輯比較有意思,並非單純的內存滿了就開始使用硬盤。首先,有 low watermark 和 high watermark 這兩個概念。

若是隊列大小達到 high watermark,隊列開始寫數據到disk 若是隊列大小降到 low watermark,中止寫入disk(直到再次達到 high watermark); 或者 disk queue 隊列爲空(即da隊列裏的數據處理完),這兩種狀況都會進入in-memory 模式

關於終止隊列的一些處理配置:

$MainMsgQueueTimeoutEnqueue [number is timeout in ms (1000ms is 1sec!), default 2000, 0 means indefinite]         #當隊列或硬盤滿了,在這個超時時間後新來的日誌,設置0能夠直接丟棄掉

$MainMsgQueueTimeoutShutdown <number> [number is timeout in ms (1000ms is 1sec!), default 0 (indefinite)]         #當隊列關閉時,還有數據在進入隊列,rsyslog會盡量在這個timeout週期內處理掉這些數據

$MainMsgQueueTimeoutActionCompletion <number> [number is timeout in ms (1000ms is 1sec!), default 1000, 0 means immediate!]     #配置須要多久來處理完當前的數據

$MainMsgQueueSaveOnShutdown [**on**/off]                                                     #針對disk queue的配置,當運行中的隊列關閉時,會先把隊列中的數據存在硬盤中

$MainMsgQueueDequeueSlowdown <number> [number is timeout in microseconds (1000000us is 1sec!), default 0 (no delay). Simple rate-limiting!]    # 簡單的出隊速度限制,單位微秒

$MainMsgQueueImmediateShutdown [on/off]     #棄用的選項,當配置的隊列大小或硬盤空間滿了之後,rsyslogd 會限制數據submitter。配置 $MainMsgQueueTimeoutEnqueue 後,當超過這個時間後新來的日誌會被丟棄;設置0爲直接丟棄。

#$MainMsgQueueTimeoutShutdown、$MainMsgQueueTimeoutActionCompletion 和 $MainMsgQueueSaveOnShutdown 是在隊列終止後能夠作的一系列措施。

關於隊列的worker thread:

$MainMsgQueueWorkerThreadMinumumMessages <number> [default 100]

$MainMsgQueueWorkerThreads <number> [num worker threads, default 1, recommended 1]

$MainMsgQueueWorkerTimeoutThreadShutdown <number> [number is timeout in ms (1000ms is 1sec!), default 60000 (1 minute)]

 

每一個隊列(direct queue除外)都有一個工做線程池(worker thread pool). 初始時,是沒有worker thread的,當有消息來是,會自動啓動一個. 「$MainMsgQueueWorkerThreadMinumumMessages」 配置一個worker thread處理的消息大小, $MainMsgQueueWorkerThreads 配置work thread的上限值。

好比設置一個worker thread的最小處理消息大小是100個,當小於100個是,只有一個worker,當超過100個,小於200個時,會有兩個worker...

以上配置要注意單位, 默認值,Main Queue 和 Action Queue 可能有些配置的默認值不同。

另外全部指明針對disk的配置,都是包括 disk queue 和 DA queue.

更多配置參考這裏:

在通常狀況下,大部分的配置均可以直接使用默認的配置,這裏給出一份Action使用DA隊列的配置:

# 這兩個是全局的

$ActionResumeRetryCount                  3

$ActionResumeInterval                    10

# 如下是每一個ActionQueue本身的配置

$ActionQueueType                         LinkedList

$ActionQueueFileName                     da_queue

$ActionQueueMaxFileSize                  100M         # 設置單個disk文件的大小

$ActionQueueMaxDiskSpace                 10G          # 設置最大佔用空間

$ActionQueueDisacdSeverity               3            # 設置忽略的等級

$ActionQueueLowWaterMark                 5000         # 默認是2000

$ActionQueueHighWatermark                15000        # 默認是8000

$ActionQueueDiscardMark                  30000        # 默認是9750

$ActionQueueSize                         80000        # 文檔沒寫,測試發現默認是1000

$ActionQueueSaveOnShutdown               on


*.* @log-center.xxx.com:514

Main Queue 的默認模式是 FixedArray,Action Queue 的默認模式是 Direct

5、實例

 1. TCP+DA模式實現可靠消息傳輸

  tcp協議的不可靠性,好比server端宕機等狀況,須要在client端配置一個本地文件,用在server端宕機的狀況下,暫時保存消息。須要注意的是。隊列名和過濾規則對應,一個隊列只能用於一個過濾規則

  舉例:

$ActionQueueType LinkedList

$ActionQueueFileName local3

$ActionResumeRetryCount -1

$ActionQueueSaveOnShutdown on

Local3.*                                            @@10.0.0.44:1999


$ActionQueueType LinkedList

$ActionQueueFileName local4

$ActionResumeRetryCount -1

$ActionQueueSaveOnShutdown on

Local4.*                                            @@10.0.0.44:1999

 

上例中可將兩條過濾規則合成一條:local3.*;local4.*

強調一點:本地隊列只有在須要使用的時候纔會建立,當後端出現短暫不可用時,rsyslog的內存隊列就能夠保存消息,內存隊列不夠用時,纔會建立本地隊列。

相關文章
相關標籤/搜索