Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 日誌管理實戰:從 rsyslog 到 journald 的完整架構

編輯:Linux 教學

日誌系統架構演進

時代核心組件特徵
傳統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

七、最佳實踐總結

  1. 統一入口:所有服務透過 systemd/journald,rsyslog 僅作轉發/整合
  2. 結構化:應用程式輸出 JSON (systemd-cat, logger --json, library),避免非結構化文本
  3. 標籤豐富:環境、版本、區域、叢集、節點、Pod、Trace ID
  4. 分級儲存:熱 (SSD, 7-30天) → 溫 (HDD/Object, 90天) → 冷 (Glacier/Archive, 年度)
  5. 告警優先:錯誤率、延遲 P99、關鍵字 (OOM, panic, denied, timeout) 即時推送
  6. 定期演練:模擬事故、驗證查詢速度、確認保留完整性、測試恢復流程

日誌非事後諸葛,而是可觀測性三支柱 (Metrics, Logs, Traces) 的語義層,投資日誌基礎設施 = 投資 MTTR 縮短。

Copyright © Windows教程網 All Rights Reserved