日誌系統架構演進
| 時代 | 核心組件 | 特徵 |
| 傳統 | syslogd / klogd | 單一 /var/log/messages、無結構化、輪替靠 logrotate |
| 企業級 | rsyslog / syslog-ng | 模組化、RELP/TCP/TLS 傳輸、資料庫寫入、高效能佇列 |
| 現代 (systemd) | systemd-journald | 二進位索引、結構化欄位、前向安全封存、整合核心/服務/使用者日誌 |
| 雲原生 | Fluentd/Fluent Bit + Elasticsearch/Loki + Grafana | 容器日誌聚合、標籤化、多租戶、查詢語言 (LogQL/Lucene) |
一、systemd-journald:現代基礎設施
核心優勢
- 結構化:每筆記錄含
MESSAGE, _PID, _UID, _SYSTEMD_UNIT, _TRANSPORT, __REALTIME_TIMESTAMP 等欄位
- 索引查詢:
journalctl -u nginx -p err -S -1h 秒級過濾
- 前向安全封存 (FSS):驗證日誌完整性,防竄改
- 自動輪替:基於大小/時間/磁碟剩餘空間
常用查詢指令
# 服務日誌
journalctl -u nginx -f # 即時追蹤
journalctl -u nginx -S -2h -U now # 最近 2 小時
journalctl -u nginx -p err..crit # 錯誤以上級別
# 核心日誌
journalctl -k -b -1 # 上次開機核心訊息
journalctl -k -g "oom|kill" # 關鍵字搜尋
# 使用者/特定程式
journalctl _COMM=sshd _PID=1234
journalctl /usr/bin/docker # 可執行檔路徑
# 格式化輸出
journalctl -o json-pretty # JSON 結構
journalctl -o short-iso # ISO 時間戳
journalctl -o cat # 純訊息
# 磁碟使用與清理
journalctl --disk-usage
journalctl --vacuum-size=500M
journalctl --vacuum-time=30d
持久化設定
# /etc/systemd/journald.conf
[Journal]
Storage=persistent # 預設 auto (僅 /var/log/journal 存在時)
Compress=yes
Seal=yes # 前向安全封存
SplitMode=uid # 按用戶分檔
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=10000
SystemMaxUse=2G # 最大佔用
SystemKeepFree=1G # 保留剩餘
SystemMaxFileSize=200M
RuntimeMaxUse=200M
# 修改後
systemctl restart systemd-journald
二、rsyslog:企業級轉發與整合
模組化架構
# /etc/rsyslog.conf 關鍵段落
module(load="imuxsock") # 本地 Unix socket
module(load="imklog") # 核心日誌
module(load="imjournal") # 從 journald 讀取 (系統日誌統一入口)
module(load="omelasticsearch") # Elasticsearch 輸出
module(load="omkafka") # Kafka 輸出
# 模板
template(name="json" type="list") {
property(name="timestamp" format="jsonf" dateFormat="iso8601")
constant(value=" ")
property(name="hostname" format="jsonf")
constant(value=" ")
property(name="syslogtag" format="jsonf")
constant(value=" ")
property(name="msg" format="jsonf")
}
# 規則集
ruleset(name="remote") {
action(type="omfwd" target="logserver.example.com" port="514" protocol="tcp"
queue.type="linkedlist" queue.size="10000" action.resumeRetryCount="-1")
}
# 套用
input(type="imjournal" ruleset="remote")
*.* action(type="omfile" file="/var/log/messages" template="json")
高效能佇列模式
- Direct:同步寫入,低延遲、阻塞風險
- LinkedList:記憶體佇列,高吞吐、記憶體壓力大
- Disk-Assisted:混合模式,記憶體滿落盤,平衡選擇
三、logrotate:輪替與保留策略
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
# 系統預設 /etc/logrotate.conf
weekly
rotate 4
create
dateext
compress
include /etc/logrotate.d
四、集中式日誌平台架構
方案 A:ELK Stack (Elasticsearch + Logstash + Kibana)
- Logstash/Fluentd 收集 → Kafka 緩衝 → Elasticsearch 索引 → Kibana 視覺化
- 適合:大規模、全文搜尋、複雜儀表板
方案 B:Loki + Promtail + Grafana (云原生輕量)
- Promtail 刮削標籤 → Loki 索引標籤 (非全文) → Grafana 查詢
- 適合:Kubernetes、標籤查詢、成本敏感、與 Prometheus 整合
方案 C:Graylog / Splunk / Datadog (商業)
五、安全與合規
| 需求 | 實作 |
| 不可竄改 | journald FSS (Forward Secure Sealing) + 定期 journalctl --verify |
| 加密傳輸 | rsyslog RELP/TLS (gtls driver), Fluent Bit TLS, syslog-ng TLS |
| 存取控制 | journald: SystemGroup=systemd-journal, ACL; 遠端: VPN/mTLS |
| 審計追蹤 | auditd (C2 級審計) + ausearch/aureport, 整合至 SIEM |
| 資料保留 | logrotate + 冷儲存 (S3/MinIO/GCS) + 生命週期策略 |
| GDPR/個資 | 欄位遮罩、偽名化、刪除請求自動化 |
六、除錯清單
# 1. 日誌不見了?
systemctl status systemd-journald rsyslog
journalctl --disk-usage
ls -lh /var/log/journal/ /var/log/
# 2. 遠端不收到?
tcpdump -i eth0 port 514 -nn
logger -n logserver -P 514 -T "test message"
rsyslog -N1 # 設定檔語法檢查
# 3. 磁碟爆滿?
journalctl --vacuum-size=500M
find /var/log -name "*.log" -size +100M -exec truncate -s 0 {} \;
# 找大檔案
du -h /var/log | sort -hr | head -20
# 4. 亂碼/編碼?
# journald 內部 UTF-8,rsyslog 設定 $EscapeControlCharactersOnReceive off
# 終端機 locale: export LC_ALL=C.UTF-8
七、最佳實踐總結
- 統一入口:所有服務透過 systemd/journald,rsyslog 僅作轉發/整合
- 結構化:應用程式輸出 JSON (systemd-cat, logger --json, library),避免非結構化文本
- 標籤豐富:環境、版本、區域、叢集、節點、Pod、Trace ID
- 分級儲存:熱 (SSD, 7-30天) → 溫 (HDD/Object, 90天) → 冷 (Glacier/Archive, 年度)
- 告警優先:錯誤率、延遲 P99、關鍵字 (OOM, panic, denied, timeout) 即時推送
- 定期演練:模擬事故、驗證查詢速度、確認保留完整性、測試恢復流程
日誌非事後諸葛,而是可觀測性三支柱 (Metrics, Logs, Traces) 的語義層,投資日誌基礎設施 = 投資 MTTR 縮短。