Linux 日誌不僅是文字檔案,更是結構化事件流。本文系統闡述 Syslog 三重含義 (守護進程/協議/訊息格式)、標準字段結構 (PRI、時間戳、HOSTNAME、APP-NAME、PROCID、MSGID)、rsyslog 實作架構,助你從「看日誌」進階到「管日誌」。
核心日誌位於 /var/log/,由 syslog 守護進程 接收、處理、寫入:
| 日誌檔 | 內容 | 典型發行版路徑 |
|---|---|---|
| 系統活動 | 開機、服務啟停、核心事件 | Debian/Ubuntu: /var/log/syslogRHEL/CentOS: /var/log/messages |
| 認證授權 | 登入成功/失敗、sudo、PAM 事件 | Debian/Ubuntu: /var/log/auth.logRHEL/CentOS: /var/log/secure |
| 核心日誌 | 內核錯誤、警告、驅動程式訊息 | /var/log/kern.log 或 dmesg |
| 定時任務 | cron 執行記錄 | /var/log/cron |
| 含義 | 描述 | 典型實現 |
|---|---|---|
| Syslog 守護進程 | 接收、處理、轉發日誌訊息的程式 | rsyslogd、syslog-ng、systemd-journald |
| Syslog 協議 (RFC 5424) | 網絡傳輸協議 (UDP 514 / TLS 6514) + 訊息格式定義 | 遠程日誌聚合、SIEM 對接 |
| Syslog 訊息 | 符合 RFC 5424 格式的結構化事件 | 程式主動發送、庫函數 syslog() |
| 字段 | 範例值 | 說明 |
|---|---|---|
| PRI (優先級) | <34> | Facility×8 + Severity。Facility: 0=kern, 1=user... 23=local7; Severity: 0=emerg ... 7=debug |
| VERSION | 1 | 協議版本 (RFC 5424 = 1) |
| TIMESTAMP | 2003-10-11T22:14:15.003Z | RFC 3339 格式,Z=UTC,可帶時區偏移如 -08:00 |
| HOSTNAME | server1.com | 發送主機名 (或 IP、FQDN) |
| APP-NAME | sshd | 產生訊息的應用程式名 |
| PROCID | - | 進程 ID,無則為 - |
| MSGID | - | 訊息類型標識,無則為 - |
| STRUCTURED-DATA | - | 結構化數據 (SD-ELEMENT),無則為 - |
| MSG | pam_unix(...): authentication failure | 自由文本訊息內容 |
# 數值計算
PRI = Facility × 8 + Severity
# 文本格式 (推薦,易搜尋)
PRI = "facility.severity" # 如 "authpriv.err"
0 Emergency 系統不可用
1 Alert 需立即處理
2 Critical 嚴重錯誤
3 Error 錯誤
4 Warning 警告
5 Notice 正常但重要事件
6 Informational 一般資訊
7 Debug 除錯資訊
[應用/內核] → /dev/log (Unix Socket) → [rsyslogd 主進程]
│
┌─────────────────────────────┼─────────────────────────────┐
▼ ▼ ▼
[本地檔案規則] [遠程轉發規則] [資料庫/其他模組]
/var/log/syslog @logserver:514 ommysql/omelasticsearch
/var/log/auth.log @@logserver:6514 (TLS)
# 模組載入
module(load="imuxsock") # 本地 Unix Socket
module(load="imklog") # 內核日誌
module(load="imtcp") # TCP 接收
module(load="omfile") # 檔案輸出
# 模板: 標準 RFC 5424 格式
template(name="RFC5424" type="list") {
property(name="pri")
constant(value=" ")
property(name="protocol-version")
constant(value=" ")
property(name="timereported" dateFormat="rfc3339")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="app-name")
constant(value=" ")
property(name="procid")
constant(value=" ")
property(name="msgid")
constant(value=" ")
property(name="msg")
constant(value="\n")
}
# 規則: 所有 authpriv.* 寫入 /var/log/secure
authpriv.* /var/log/secure;RFC5424
# 規則: 遠程轉發 (TCP + TLS)
*.* @@(o)logserver.example.com:6514;RFC5424

現代趨勢:systemd-journald 取代傳統 syslog 成為核心收集器,支援二進制索引、字段索引、ACL、轉發到 rsyslog/Elasticsearch。建議新部署採用 journald → rsyslog → 遠程存儲 架構。