日誌伺服器搭建之多伺服器日誌轉發與格式化處理

許錚的技術成長之路發表於2019-03-03

日誌伺服器搭建是靠linux的rsyslog功能作日誌轉發和日誌收集的

rsyslog是由一臺Linux伺服器作日誌伺服器,收集其他伺服器即rsyslog客戶端轉發過來的日誌,所以rsyslog既可以作為日誌伺服器,也可以作為日誌客戶端去使用

rsyslog配置介紹

rsyslog配置包括/etc/rsyslog.conf檔案和/etc/rsyslog.d資料夾下的自定義配置檔案(自定義配置檔案會在rsyslog.conf全域性配置中被載入)

rsyslog.conf配置檔案包括模組配置、全域性配置、規則三部分

日誌伺服器配置

日誌伺服器的rsyslog配置檔案包括以下幾個部分:

模組配置

一般來說,只需要配置作為日誌伺服器通過UDP協議還是TCP協議接收其他伺服器的日誌檔案即可

模組配置
通過UDP傳輸內容較快,但是可能會出現丟失;而TCP協議傳輸則較為安全

全域性配置

全域性設定
圖中模板,logfile為任意命名,後面的%%內的內容則是rsyslog變數

附rsyslog變數: data items在rsyslog中叫做properties,一般用在templates(就是%%之間的變數)或者條件判斷中。主要有三種Properties:

Message Properties:
msg			        匹配message中的msg部分
rawmsg			    從socket收到的資訊,一般用來debug
rawmsg-after-pri	和rawmsg類似,但是syslog PRI被移除了
hostname		    message的主機名
source			    HOSTNAME的別名
fromhost		    message來源的主機名,一般是用在relay chain中
fromhost-ip		    同fromhost,不過獲取的是ip
syslogtag		    message的tag
programname		    是tag的靜態部分,例如tag是named[123456],則programname是named
pri			        message的PRI,undecoded格式

System Properties:
$bom			The UTF-8 encoded Unicode byte-order mask (BOM)
$myhostname		The name of the current host as it knows itself

Time-Related System Properties:
$now			當前日期,格式YYYY-MM-DD,now是指當前message被處理的時間
$year			當前年份(4-digit)
$month			當前月份(2-digit)
$day			當前日期(2-digit)
$hour			當前小時(24 hour) time (2-digit)
$hhour			From minute 0 to 29, this is always 0 while from 30 to 59 it is always 1.
$minute			當前分鐘(2-digit)
複製程式碼

規則(選擇器+動作)

每個規則行由兩部分組成,selector部分和action部分,這兩部分由一個或多個空格或tab分隔,selector部分指定源和日誌等級,action部分指定對應的操作。

選擇器 SELECTORS selector也由兩部分組成,設施和優先順序,由點號.分隔。第一部分為訊息源或稱為日誌設施,第二部分為日誌級別。

日誌設施有

auth(security), authpriv: 授權和安全相關的訊息
kern: 來自Linux核心的訊息
mail: 由mail子系統產生的訊息
cron: cron守護程式相關的資訊
daemon: 守護程式產生的資訊
news: 網路訊息子系統
lpr: 列印相關的日誌資訊
user: 使用者程式相關的資訊
local0 to local7: 保留,本地使用
複製程式碼

日誌級別有(升序):

debug:包含詳細的開發情報的資訊,通常只在除錯一個程式時使用。
info:情報資訊,正常的系統訊息,比如騷擾報告,頻寬資料等,不需要處理。
notice: 不是錯誤情況,也不需要立即處理。
warning: 警告資訊,不是錯誤,比如系統磁碟使用了85%等。
err:錯誤,不是非常緊急,在一定時間內修復即可。
crit:重要情況,如硬碟錯誤,備用連線丟失。
alert:應該被立即改正的問題,如系統資料庫被破壞,ISP連線丟失。
emerg:緊急情況,需要立即通知技術人員。
none:沒有記錄等級
複製程式碼

特別留意一下在訊息等級之前還有 .[=!] 的連線符號喔!他代表的意思是這樣的: . :代表『比後面還要嚴重的等級(含該等級)都被記錄下來』的意思,例如: mail.info 代表只要是 mail 的諮詢,而且該資訊等級嚴重於info (含 info 本身)時,就會被記錄下來的意思。 .=:代表所需要的等級就是後面接的等級而已, 其他的不要! .!:有點反向選擇的感覺,代表忽略大於等於這個等級的訊息! 亦即是低於這個等級的才會被記錄的意思!

動作 ACTION action是規則描述的一部分,規則用於處理訊息。總的來說,訊息內容被寫到一種日誌檔案上,但也可以執行其他動作,比如寫到資料庫表中或轉發到其他主機。

動作設定

備註:
1、日誌檔案前面的減號表示的意思是非同步寫檔案,比如: mail.!info -/var/log/mail.info
2、而*.emerg :omusrmsg:代表所有服務emerg級別的日誌都會告知所有線上人員
3、
.* ?模板名錶示所有日誌都遵循logfile模板格式

日誌客戶端配置

日誌客戶端也是使用rsyslog功能,且配置檔案和日誌伺服器一樣,但一般只會在全域性配置中配置以下內容

客戶端配置
. @IP表示將所有系統資訊和定義local0-local7的自定義資訊通過UDP傳輸到某IP . @@IP則表示通過TCP傳輸 而轉發內容和規則也可以寫到/etc/rsyslog.d/下的一個單獨檔案

符號"& ~"表示了一個重定向規則,被用來告知rsyslog守護程式停止對日誌訊息的進一步處理,並且不要在本地寫入。只需要寫入指定檔案或伺服器中即可,如果沒有使用該重定向規則,那麼所有的遠端訊息都會在寫入上述描述的日誌檔案之外同時被寫入到本地日誌檔案,這就意味著日誌訊息實際上被寫了多次。如: . @IP & ~

備註: local0-local7的自定義服務需要在對應服務的配置檔案中配置,否則轉發過去的日誌只有系統日誌

重啟rsyslog

所有對於rsyslog的更新都需要重啟rsyslog,包括對rsyslog.conf更改後的:wq操作,否則rsyslog無法繼續使用

centos7系統:
systemctl restart rsyslog.service
ubuntu或centos6:
service rsyslog restart
複製程式碼

laravel服務轉發

laravel自身支援將日誌打到rsyslog,但是需要啟動該配置,啟動了syslog配置後,即可打到rsyslog日誌中,rsyslog會自動監控。如果其中日誌發生變化,會轉發到日誌伺服器中

laravel配置

最終轉發到日誌伺服器的結果如圖:

最終結果

相關文章