平常工做中,常遇到些問題,會查看Linux的系統日誌,日誌多種多樣,boot.log, messages, auth.log, syslog等等,但每次出現問題老是憑藉直覺和經驗去一個一個翻,是下下策。搭建ELK,或者Graylog等日誌分析系統也是極好的,可是體積太大了,須要考慮和維護的東西也就更多。故而經過一些更輕量級的配置,加上本身的一些理解分析,想實現一套日誌分析系統。而針對系統模塊的日誌,首當其衝的是要搞定rsyslog。html
如下主要是針對rsyslog配置的講解。json
對日誌進行分析,首先第一步要規整日誌。vim
/etc/rsyslog.conf
是rsyslog服務的總配置文件/etc/rsyslog.d
該目錄是單獨配置的rsyslog配置文件vim /etc/rsyslog.conf # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf # 我的建議,將全部的rule都配置在該目錄下,在/etc/rsyslog.conf中不寫rule
系統日誌後端
日誌類型 | 日誌內容 |
---|---|
auth | 用戶認證時產生的日誌 |
authpriv | ssh、ftp等登陸信息的驗證信息 |
daemon | 一些守護進程產生的日誌 |
ftp | FTP產生的日誌 |
lpr | 打印相關活動 |
mark | 服務內部的信息,時間標識 |
news | 網絡新聞傳輸協議(nntp)產生的消息。 |
syslog | 系統日誌 |
security | |
uucp | Unix-to-Unix Copy 兩個unix之間的相關通訊 |
console | 針對系統控制檯的消息。 |
cron | 系統執行定時任務產生的日誌。 |
kern | 系統內核日誌 |
local0~local7 | 自定義程序使用 |
郵件日誌 | |
user | 用戶進程 |
Note: 不建議使用關鍵字 security,而且 mark僅供內部使用,所以不該在應用程序中使用bash
日誌等級 | 說明 | |
---|---|---|
7 | emerg | 緊急狀況,系統不可用(例如系統崩潰),通常會通知全部用戶。 |
6 | alert | 須要當即修復的告警。 |
5 | crit | 危險狀況,例如硬盤錯誤,可能會阻礙程序的部分功能。 |
4 | error/err | 通常錯誤消息。 |
3 | warning/warn | 警告。 |
2 | notice | 不是錯誤,可是可能須要處理。 |
1 | info | 通用性消息,通常用來提供有用信息。 |
0 | debug | 調試程序產生的信息。 |
none | 沒有優先級,不記錄任何日誌消息。 |
結合使用的 rule 示例(懶人福利,CV大法,即粘即用)網絡
# 記錄mail日誌等級爲error及以上日誌 mail.err /var/log/mail_err.log # 記錄mail全部等級爲warn級別的日誌(僅記錄warn級別) mail.=warn /var/log/mail_err.log # 記錄kern全部日誌 kern.* /var/log/kern.log # 將mail的全部信息,除了info之外,其餘的都寫入/var/adm/mail mail.*;mail.!=info /var/adm/mail # 將日誌等級爲crit或更高的內核消息定向到遠程主機finlandia # 若是主機崩潰,磁盤出現不可修復的錯誤,可能沒法讀取存儲的消息。若是有日誌在遠程主機上,能夠嘗試找出崩潰的緣由。 kern.crit @finlandia # 記錄全部類型的warning等級及以上日誌 *.warning /var/log/syslog_warn.log # 記錄mail的warning日誌和kern的error日誌,其餘全部的info日誌 *.info;mail.warning;kern.error /var/log/messages # 記錄kernel的info到warning日誌 kern.info;kern.!err /var/adm/kernel-info # 將mail和news的info級別日誌寫入/var/adminfo mail,news.=info /var/adm/info # 將全部系統中全部類型的info日誌和notice日誌存入/var/log/massages,mail的全部日誌除外。 *.=info;*.=notice;\ mail.none /var/log/messages # 緊急消息(emerg級別)將使用wall顯示給當前全部登陸的用戶 *.=emerg * # 該規則將全部alert以及更高級別的消息定向到操做員的終端,即登陸的用戶「root」和「joey」的終端。 *.alert root,joey
單獨把這個拎出來寫。app
上面的大概就是全部能用到的規則了,而這些規則有時候仍是有些問題的ssh
For example?socket
Exapmple Adebug
mail.crit,*.err /var/log/syslog_err.log # 這樣的狀況,最終的結果仍是會把mail的err級別日誌輸出到syslog_err.log
Exapmple B
mail.!warn /var/log/mail.log # 看起來是將mail的warn如下級別的日誌輸出到/var/log/mail.log,其實否則,你會發現你什麼也得不到。 # 官方的解釋是,感嘆號(就是形似這個的符號 ==> !) 就是個過濾器,你得先有東西,才能去過去,好比: mail.*;mail.!warn /var/log/mail.log
Exapmple C
若是在規則結束後當即使用反斜槓,而中間沒有空格,那麼使用反斜槓將行一分爲二是無效的。
以上都是官方建議
如下是我的建議
既然是規整日誌,不論是出於什麼緣由,那必定是爲了用起來更方便,看起來更簡潔。別整太多花裏胡哨的,實用就行。想明白本身要啥效果,撿本身用得着的看就行。莫要本末倒置,化簡爲繁。
模板元素屬性
屬性 | 釋義| |
---|---|
msg | 日誌的信息內容,message。 |
rawmsg | 不轉義的日誌內容。轉義是默認開啓的(EscapecontrolCharactersOnReceive),因此它有可能與socket中接收到的內容不一樣。 |
rawmsg-after-pri | 幾乎與rawmsg相同,可是刪除了syslog PRI。 |
hostname | 打印該日誌的主機名。 |
source | hostname屬性的別名。 |
fromhost | 接收的信息來自於哪一個節點。這裏是DNS解析的名字。 |
fromhost-ip | 接收的信息來自於哪一個節點,這裏是IP,本地的是127.0.0.1。 |
syslogtag | 信息標籤。大體形如 programed[14321] 。 |
programname | tag的一部分,就是上面的programed那個位置。 |
pri | 消息的PRI部分-未解碼(單值) |
pri-text | 文本形式的消息的PRI部分,並在括號中添加數值PRI(例如「local0.err<133>」) |
iut | InfoUnitType 一款監視器軟件,在與監視器後端通訊的時候使用 |
syslogfacility | 設備信息,數字形式表示 |
syslogfacility-text | 設備信息,文本形式表示 |
syslogseverity | 日誌嚴重性等級,數字形式表示 |
syslogseverity-text | 日誌嚴重性等級,文本形式表示 |
syslogpriority | 同 syslogseverity |
syslogpriority-text | 同 syslogseverity-text |
timegenerated | 高精度時間戳 |
timereported | 日誌中的時間戳。精度取決於日誌中提供的內容(在大多數狀況下,爲秒級) |
timestamp | 同 timereported |
protocol-version | IETF draft draft-ietf-syslog-protocol 中的 PROTOCOL-VERSION 字段的內容 |
structured-data | IETF draft draft-ietf-syslog-protocol 中的 STRUCTURED-DATA 字段的內容 |
app-name | IETF draft draft-ietf-syslog-protocol 中的 APP-NAME 字段的內容 |
procid | IETF draft draft-ietf-syslog-protocol 中的 PROCID 字段的內容 |
msgid | IETF draft draft-ietf-syslog-protocol 中的 MSGID 字段的內容 |
inputname | 生成日誌的輸入模塊的名稱(如「imuxsock」、「imudp」) |
jsonmesg | 整個日誌對象做爲json表示。可能出現數據重複,譬如syslogtag包含着programname,但二者都會分別表示。因此這個屬性有一些額外開銷,建議只有在實際須要的時候再用。 |
與時間相關的系統屬性(以 2020-07-08 16:57:36
爲例)
屬性 | 釋義 |
---|---|
$now | 當前日期時間戳,格式爲YYYY-MM-DD (2020-07-08) |
$year | 當前年份, 四位數 (2020) |
$month | 當前月份, 兩位數 (07) |
$day | 當前月份的日期,兩位數 (08) |
$wday | 當前天數週幾 :0=Sunday,...6=Saturday |
$hour | 當前小時(24小時機制),兩位數(16) |
$hhour | 半小時機值,就是0-29分鐘顯示0,30-59分鐘顯示1。 |
$qhour | 一刻鐘機值,經過0-3顯示,每15分鐘一截。 |
$minute | 當前分鐘數,兩位數(57) |
經過模板修改日誌
vim /etc/rsyslog.conf # 建立一個名爲cky_format的模板,其中 TIMESTAMP:8:15 表示timestamp屬性值切片第八位到第十五位。 $template cky_format, "%$NOW% %TIMESTAMP:8:15% %hostname% %syslogseverity-text% %syslogtag% %msg%\n" $ActionFileDefaultTemplate cky_format #重啓rsyslog systemctl restart rsyslog
日誌格式效果樣例
# NOW | timestamp:8:15| hostname| syslogseverity-text | syslogtag | msg 2020-07-09 09:59:54 mycomputer info systemd: Started System Logging Service. # 時間戳 | 主機名 | 日誌等級 | 服務進程 | 日誌內容
尚有不足之處,望各位看客斧正,本文後續會逐漸完善。