登錄檔(Log)的重要性#

登錄檔是系統運作的黑盒子記錄器,記錄了系統從開機到關機之間發生的每一件事。它的三大功能:

  1. 系統除錯:服務啟動失敗、硬體異常、核心錯誤
  2. 安全稽核:未授權的登入嘗試、sudo 操作記錄、檔案異動
  3. 效能分析:服務回應時間、資源使用狀況

在生產環境中,「看 log」是排除問題的第一步。養成查看 log 的習慣,比盲目 Google 錯誤訊息更有效率。

CentOS 7 的兩套日誌系統#

CentOS 7 同時運作兩套日誌系統,各有分工:

rsyslogd:傳統日誌服務#

  • 負責將日誌持久化到磁碟上的檔案中
  • 設定檔:/etc/rsyslog.conf
  • 日誌存放在 /var/log/ 目錄下

systemd-journald:systemd 的日誌服務#

  • 收集所有 systemd 管理的服務的輸出
  • 預設存放在記憶體中(/run/log/journal/),重開機即消失
  • 可以設定為持久化到磁碟
  • journalctl 查詢

兩者的關係是互補的:journald 收集所有 systemd 服務的日誌,rsyslogd 從 journald 接收後寫入傳統的日誌檔案。這讓系統同時支援現代的 journalctl 查詢和傳統的 tail -f /var/log/messages 操作。

rsyslog 的設定邏輯#

rsyslog 的設定遵循一個簡單的模式:

服務名稱.訊息等級    記錄位置

服務名稱(Facility)#

指定訊息的來源:

名稱來源
kern核心
auth認證系統(login、sudo)
mail郵件系統
cron排程系統
daemon各種系統服務
local0-7自訂分類

訊息等級(Severity)#

由輕到重:

等級意義
debug除錯資訊
info一般資訊
notice值得注意但正常的事件
warning警告
err錯誤
crit嚴重錯誤
alert需要立即處理
emerg系統無法使用

設定日誌等級時,指定某個等級代表該等級及以上都會被記錄。例如設定 warning 就會記錄 warning、err、crit、alert、emerg。

常見的日誌檔案#

檔案內容
/var/log/messages系統最重要的日誌,大部分非認證相關的訊息都在這裡
/var/log/secure認證相關的日誌(SSH 登入、sudo 操作)
/var/log/maillog郵件系統日誌
/var/log/cron排程執行記錄
/var/log/boot.log開機過程的日誌
/var/log/dmesg核心偵測硬體的訊息

logrotate:日誌輪替#

日誌檔案會持續增長,如果不處理,最終會佔滿磁碟。logrotate 負責自動管理日誌檔案的生命週期:

  • 輪替:定期將目前的日誌檔更名(如 messagesmessages.1)並建立新檔案
  • 壓縮:舊的日誌檔可以自動壓縮節省空間
  • 刪除:超過保留期限的舊檔案自動刪除

logrotate 本身由 cron 定期觸發(通常每天一次)。

logrotate 的設定不當是造成磁碟空間不足的常見原因。如果一個高流量的服務產生大量日誌,但 logrotate 的輪替頻率太低或保留份數太多,/var/log 可能會被撐爆。

日誌安全#

日誌本身也需要保護:

  • 限制存取權限:日誌中可能包含敏感資訊(IP、帳號、操作記錄),不應讓所有人都能讀取
  • 防止竄改:入侵者的第一件事通常是清除日誌。可以設定日誌的 a(append only)隱藏屬性
  • 遠端備份:將日誌同步到遠端伺服器,即使本機被攻破,日誌仍有備份