如何用 logrotate 管理伺服器日誌
在 Linux 伺服器環境中,日誌檔案(Log Files)是追蹤系統狀態、排查錯誤以及安全審計的重要依據。然而,隨著伺服器運行時間的增長,應用程式(如 Nginx、Apache、Postfix 或自訂腳本)產生的日誌會迅速膨脹,不僅佔用寶貴的磁碟空間,更可能導致磁碟寫入延遲甚至服務中斷。
雖然許多現代服務本身具備日誌輪替(Log Rotation)的功能,但 Linux 系統層級提供了一個強大且標準化的工具——logrotate,用於集中管理所有日誌檔案。對於中階 Linux 使用者而言,掌握 logrotate 的運作機制與配置方法,是維持伺服器穩定運行的基本功。本文將循序漸進地介紹如何安裝、配置並驗證 logrotate。
安裝與基本結構
在 Ubuntu 22.04 或 Debian 12 等基於 Debian 的發行版中,logrotate 通常預設已安裝。若您的環境中缺失此工具,可透過以下指令安裝:
sudo apt update
sudo apt install logrotate
logrotate 的運作邏輯主要依賴兩個關鍵路徑:
- 主配置文件:
/etc/logrotate.conf。這是全局設定檔,定義了默認的行為(如保留天數、壓縮方式等)。 - 配置目錄:
/etc/logrotate.d/。這是存放個別應用程式日誌配置的地方。我們通常不需要修改主配置文件,而是直接在該目錄下為特定服務創建配置文件。
創建第一個 logrotate 配置
假設我們有一個自訂應用程式 /var/log/myapp/access.log,我們希望當該檔案超過 10MB 時進行輪替,並保留最近 5 個版本,同時對舊檔案進行壓縮以節省空間。
首先,在 /etc/logrotate.d/ 目錄下創建一個與應用名稱一致的配置文件:
sudo nano /etc/logrotate.d/myapp
在文件中輸入以下內容:
/var/log/myapp/access.log {
daily
rotate 5
size 10M
compress
delaycompress
missingok
notifempty
create 0644 root root
postrotate
# 通知應用程式重新載入日誌配置
/usr/bin/systemctl reload myapp.service > /dev/null 2>&1 || true
endscript
}
參數詳細解析
daily:指定輪替頻率。除了daily,還可設定weekly、monthly或yearly。若需依檔案大小觸發,可改用size參數(如上例所示),或同時使用兩者以確保任一條件滿足即觸發。rotate 5:指定保留的日誌檔案數量。當檔案數量超過 5 個時,最舊的檔案將被自動刪除。size 10M:當檔案大小超過 10MB 時觸發輪替。若未設定此參數,則完全依賴時間週期。compress:啟用壓縮功能,預設使用 gzip 壓縮舊檔案,副檔名會變成.gz。delaycompress:這是一個實用的選項。它會延遲壓縮,使得上一次輪替產生的檔案(例如access.log.1)保持未壓縮狀態,僅壓縮更早的檔案。這在除錯時非常方便,因為您可以直接查看access.log.1而不需解壓。missingok:如果日誌檔案不存在,不報錯並繼續執行。這能避免因檔案暫時缺失導致的腳本錯誤。notifempty:如果日誌檔案為空,則不進行輪替,避免產生無用的空檔案。create 0644 root root:輪替後建立新的日誌檔案,並設定其權限為0644,所有者為root,所屬群組為root。postrotate ... endscript:在日誌輪替後執行的腳本。許多服務(如 Nginx 或 MySQL)在日誌檔案被移動後,仍會繼續寫入舊檔案描述符,因此需要發送信號(如SIGHUP或reload)讓服務重新開啟新的日誌檔案。
測試與執行
配置完成後,切勿直接等待定時任務觸發。我們應先手動測試配置是否正確,並檢查語法錯誤。
使用 -d(debug)參數可以模擬執行過程,僅顯示將要執行的操作,而不會真正修改檔案:
sudo logrotate -d /etc/logrotate.d/myapp
若輸出中沒有錯誤訊息,且顯示了預期的輪替邏輯,則配置正確。若要立即強制執行輪替,使用 -f(force)參數:
sudo logrotate -f /etc/logrotate.d/myapp
執行後,您可以檢查 /var/log/myapp/ 目錄,確認是否生成了 .1、.1.gz 等檔案,以及新建立的 access.log 是否正確寫入資料。
常見問題與排解
1. 日誌未自動輪替或時間不對?
logrotate 通常由系統定時任務(cron)調用。在 Ubuntu/Debian 中,它由 /etc/cron.daily/logrotate 腳本每日執行。您可以檢查該腳本的內容,了解其預設參數。若您的配置未生效,請檢查 /var/log/syslog 或 /var/log/alternatives.log 尋找相關錯誤訊息。此外,確保您的配置文件沒有語法錯誤,且路徑權限正確。
2. 輪替後服務無法寫入新日誌?
這是常見的陷阱。若您在 postrotate 區塊中執行的重啟指令失敗,服務可能會繼續寫入已被移走的舊日誌檔案。務必在 postrotate 腳本中加入錯誤處理(如 || true),並確認服務名稱與重啟指令正確。對於 systemd 服務,使用 systemctl reload 通常比 restart 更合適,因為它不會中斷現有連線。
小結
logrotate 是 Linux 系統管理員不可或缺的工具,它能有效防止日誌檔案無限增長所帶來的風險。透過在 /etc/logrotate.d/ 中為每個服務創建專屬配置,您可以靈活地控制輪替頻率、保留數量與壓縮策略。
建議您在部署新服務時,一併規劃其日誌管理策略。定期檢視 /var/log/ 目錄的大小,並監控 logrotate 的執行日誌,將能大幅降低因磁碟空間耗盡而導致的伺服器災難。掌握這項技能,將使您的伺服器維護工作更加輕鬆且專業。