登錄檔(Log)的重要性#
登錄檔是系統運作的黑盒子記錄器,記錄了系統從開機到關機之間發生的每一件事。它的三大功能:
- 系統除錯:服務啟動失敗、硬體異常、核心錯誤
- 安全稽核:未授權的登入嘗試、sudo 操作記錄、檔案異動
- 效能分析:服務回應時間、資源使用狀況
在生產環境中,「看 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) |
| 郵件系統 | |
| 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 負責自動管理日誌檔案的生命週期:
- 輪替:定期將目前的日誌檔更名(如
messages→messages.1)並建立新檔案 - 壓縮:舊的日誌檔可以自動壓縮節省空間
- 刪除:超過保留期限的舊檔案自動刪除
logrotate 本身由 cron 定期觸發(通常每天一次)。
logrotate 的設定不當是造成磁碟空間不足的常見原因。如果一個高流量的服務產生大量日誌,但 logrotate 的輪替頻率太低或保留份數太多,
/var/log可能會被撐爆。
日誌安全#
日誌本身也需要保護:
- 限制存取權限:日誌中可能包含敏感資訊(IP、帳號、操作記錄),不應讓所有人都能讀取
- 防止竄改:入侵者的第一件事通常是清除日誌。可以設定日誌的
a(append only)隱藏屬性 - 遠端備份:將日誌同步到遠端伺服器,即使本機被攻破,日誌仍有備份