爲什麼使用rsyslog?
1.他是POSIX-like系統中標準的logging,有些軟件,比如haproxy,只使用syslog。所以你不能完全消除它
2.通過網絡硬件被使用
3.它有更復雜的設置,但更多的功能比競爭對手的更好。例如,Elastic Filebeat仍然不能使用inofity
4.低內存的使用。
5.允許在保存和轉發之前更改消息
6.相比rsyslog的功能更加全面
rsyslog使用的協議爲:syslog.
消息格式
通過網絡傳輸的syslog消息看起來是這樣的:
<PRI> TIMESTAMP HOST TAG MSG
PRI:優先級。facility * 8 + severity
facility:0-23 severity:級別
TIMESTAMP:時間格式
HOST:主機名
tag:包含生成消息的程序的名稱
msg:消息
rsyslog日誌收集的主體流程:
客戶端(input--->filter---->output)===網絡傳輸===>服務端(input--->filter---->output)
客戶端配置解析:
input:
主要選項:
tag:指定這個值的作用是在template中指定rsyslogtag內容,然後傳遞給服務端用於區分文件名。
facility:可以不指定,默認就是local0,這個數據會傳遞到服務端用於做條件判斷
涉及到讀取通配符設置的日誌文件和多行讀取:
1.爲什麼使用通配符設置日誌文件:如果一個目錄下有很多日誌文件,你都像傳輸到遠程主機去,此時可以設置如上面的第一行:
格式爲:
說明:使用*匹配所有文件,此時匹配的是整個路徑,並開啓元數據,這樣元數據就會附加到消息中。然後再filter的過程中使用re_extract過濾整個路徑只剩下文件名,然後將這個文件名附 加給一個局部屬性,最後將這個局部屬性附加到template,並和對應的tag部分想結合組成新的tag部分。
當然也可以不使用,如第2,3個將指定的日誌文件傳輸到遠程主機。
2.日誌多行處理:
使用多行消息的文件imfile提供3個選項
readMode=1消息被空字符串分割
readMode=2新消息從行首的rhe開始。如果行是從空格或表格開始的,它就是消息的一部分。堆棧跟蹤通常是這樣的
startmsg.regex通過regexp(POSIX Extended)定義新消息
前兩個選項在inotify模式下有問題,第三個選項可以全部替換爲正確的regexp,所以我們會使用它。讀取多行日誌有一個微妙之處。新消息標記通常放在消息的第一行。因此,在新消息開始之前,我們不能確定最後一條消息是否完整。因爲最後一條消息可能永遠不會被傳輸。爲了避免這種情況,我們設置參數readTimeout,在此秒數之後,最後一條消息被認爲已經完成。
filter and output:
上面的input部分已經指定了ruleset規則集,裏面可以包含多個操作,操作裏面可以引用不同的template,同時可以指定傳輸的類型,在template中可以指定要傳輸的日誌格式。格式之間可能有空格。
template有多種用法:
1.在客戶端指定傳輸的日誌格式
2.在服務端指定日誌的保存的路徑已經文件名
此處使用RELP模塊進行傳輸而不是UDP或TCP
原因:如果消息是使用rsyslog在主機之間傳輸的,那麼可以使用RELP ,l而不是普通的TCP。它是爲rsyslog創建的,現在其他一些系統也支持它。例如,它由Logstash和Graylog支持。使用TCP 進行傳輸。可以選擇使用TLS加密消息。它比普通的TCP syslog更可靠,因爲它不會在連接中斷時丟失消息。它解決了多行消息的問題。
server:
input:使用imRELP模塊接收日誌並指定相應的規則集。並且引用指定模塊消除msg之前的空格。
讓我們加載所有必要的模塊並關閉$EscapeControlCharactersOnReceive,否則我們將在接收到的消息中使用\n而不是新行.
固定的格式:設置目錄和文件的權限。
如下爲指定的格式,一般不需要修改:
filter and 寫入新文件:
現在讓我們創建規則集來解析傳入的消息並將其保存到適當的文件和文件夾中。依賴於syslog的服務期望節省消息時間和其他syslog字段。因此,具有標準功能的消息以syslog格式保存。對於具有local0-local7功能的消息,我們將從tag中生成文件名,並保存沒有其他syslog字段的純消息。消息前面有額外空間的問題仍然存在,因爲它出現在消息解析階段。我們會把它剪掉。
爲了提高性能,我們將使用異步寫:asyncwrite ="on"和大緩衝區:ioBufferSize=64k。我們不會在每個接收到的消息:flushOnTXEnd="off"之後刷新緩衝區,但是我們將每秒刷新一次,以便在日誌服務器上擁有新日誌:flushInterval="1"
說明:消息從上面的imRELP模塊進行之後,進入如下的規則集,然後進行判斷,並根據客戶端傳遞過來的tag部分然後使用replace和field方法進行分割並賦值個appname和logpath,然後進入操作,類型是寫入文件,文件名是根據dynaFile獲取,template指定常規模塊,將日誌寫入到文件。
如上action裏面的dynaFile指定生成動態的文件路徑的template。temolate部分如下:
另外還有隊列,不過多說明。