Syslog
syslog 服務器可以用作一個網絡中的日志監控中心,rsyslog 是一個開源工具,被廣泛用於 Linux 系統以通過 TCP/UDP 協議轉發或接收日志消息。
rsyslog 作為標准的 syslog 守護進程,預裝在了大多數的 Linux 發行版中。在客戶端/服務器架構的配置下,rsyslog 同時扮演了兩種角色:
- 作為一個 syslog 服務器,rsyslog 可以收集來自其他設備的日志信息;
- 作為一個 syslog 客戶端,rsyslog 可以將其內部的日志信息傳輸到遠程的 syslog 服務器。
一、什么是 syslog
這里的 facility 為模塊,serverity 為等級,由這兩個信息共同計算出一個 PRI 頭部。HEADER 部分包含了時間和主機名。在 HEADER 和 MSG 之間有一個空格,MSG 是需要記錄的日志部分(日志消息體)。
這里也就是說,理論上使用這種格式構造的字符串發送,接收方就能解析出來。實際上根據實驗,我使用了 UDP 發送,接收方 syslog 日志服務器能正確解析。
這里需要注意的是,如果使用了程序的庫,比如:python 的 syslog 庫(同樣 c++ 也有相似的庫),那么就不再需要關注 PRI 和 HEADER 部分,只要將相關的參數(facility,severity,time,ip)傳入函數,調用發送就可以,不必自己構造字符串。對服務端來說,接收到的是整個消息,但通常來講,比如使用 linux 默認的 rsyslog 作為接收服務端的話,是不能看到除 MSG 之外的部分。所看到的消息跟接收端配置有關,這個在下面有具體的講。
表1 Facility: 有 0-23 種設備可選
名稱 | 說明 | 編號 |
---|---|---|
auth | 身份驗證相關的消息(登錄時) | |
cron | 進程或應用調度相關的消息 | |
daemon | 守護進程相關的消息(內部服務器) | |
kernel | 內核相關的消息 | |
內部郵件服務器相關的消息 | ||
syslog | syslog 守護進程本身相關的消息 | |
lpr | 打印服務相關的消息 | |
local0 - local7: 用戶自定義的消息(local7 通常被 CentOS 和 Windows 服務器使用) |
表2 Severity: 日志等級
名稱 | 說明 | 編號 |
---|---|---|
emerg | Emergency(緊急) | 0 |
alert | Alerts (報警) | 1 |
crit | Critical (關鍵) | 2 |
err | Errors (錯誤) | 3 |
warn | Warnings (警告) | 4 |
notice | Notification (通知) | 5 |
info | Information (消息) | 6 |
debug | Debugging (調試) | 7 |
在 rsyslog 里, syslog 的配置是基於以下模式進行結構化的。
[facility-level].[severity-level] [destination]
二、rsyslog
2.1 rsyslog 安裝及啟動
yum install -y rsyslog # 一般默認已經安裝
service rsyslog restart
2.2 rsyslog 配置文件(/etc/rsyslog.conf)
配置文件 /etc/rsyslog.conf 大概分為三個部分:MODULES、GLOBAL DIRECTIVES、RULES
(1) MODULES
這個部分主要用來配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。
(2) GLOBAL DIRECTIVES
這個部分主要用來配置模板,模板的作用是指定你希望在日志文件中保存的日志格式。
默認配置為:
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
這里列舉一個模板,將所有信息保存:
# 這里第一行(為了方便顯示,參數寫成了一列)是模板,即日志服務器記錄到日志文件的格式
# 第二行是指定需要使用的模板 myFormat,這個名字可以自己定義
$template myFormat,"%TIMESTAMP% host=%HOSTNAME%,
relayHost=%FROMHOST%,
tag=%syslogtag%,
programName=%programname%,
procid=%PROCID%,
facility=%syslogfacility-text%,
sev=%syslogseverity-text%,
appName=%APP-NAME%,
msg=%msg%\n"
$ActionFileDefaultTemplate myFormat
(3) RULES
這個模塊主要講一下轉發規則。
*.* @@remote-host:514
根據這個實例可以看出,分為 4 個部分 [模塊.等級] [轉發協議][日志服務器地址]:[日志服務器端口]。其中轉發協議的參數 @@ 為 TC P協議,對應的接收端也需要配置接受 TCP 協議;@ 為 UDP 協議。
三、syslog 接收日志
在 GLOBAL DIRECTIVES 之前追加如下配置:
$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.* ?IpTemplate
& ~
說明:
-
$template IpTemplate
(“IpTemplate” 可自定義)指令使 rsyslog 后台進程將日志消息寫到 /var/log 下的單獨的本地日志文件中,其中日志文件的名稱是基於遠程日志發送機器的主機名以及生成該日志的應用程序名進行定義的。 -
*.* ?IpTemplate
將 IpTemplate 模板應用到所有接收到的日志上。 -
& ~
表示了一個重定向規則,被用來告知 rsyslog 守護進程停止對日志消息的進一步處理,並且不要在本地寫入。如果沒有使用該重定向規則,那么所有的遠程消息都會在寫入上述描述的日志文件之外同時被寫入到本地日志文件,這就意味着日志消息實際上被寫了兩次。使用該規則的另外一個結果就是 syslog 服務器本身的日志消息只會被以該機器主機名命名的專有文件中。
rsyslog 接收遠程日志且去掉日志頭配置如下:
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
$template myformat,"%msg%\n"
#$template myformat,"%$NOW% %TIMESTAMP:8:15% %hostname% %syslogtag% %msg%\n"
$ActionFileDefaultTemplate myformat
$template IpTemplate,"/var/log/%FROMHOST-IP%.log"
*.* ?IpTemplate
& ~
四、syslog 發送日志
發送日志的配置很簡單,只需要配置要發送的地址就 ok
*.* @@192.168.1.25:514 # tcp 協議
local7.info @192.168.1.25:514 # udp 協議,只發送用戶的 info 級別日志
參考:
- 《Linux 配置 syslog 服務》:https://blog.csdn.net/senlin1202/article/details/50800385
- 《Linux 下 rsyslog 日志收集服務環境部署記錄》:https://www.cnblogs.com/kevingrace/p/5570411.html
每天用心記錄一點點。內容也許不重要,但習慣很重要!