在 Linux 系統維護中,日誌檔案若不加以管理,將無限增長佔滿磁碟空間。logrotate 是專為解決此問題而生的標準工具,它能自動執行日誌的輪替、壓縮、刪除與郵寄等操作。本文將深入淺出地介紹其運作原理、核心配置檔結構、常用指令參數,並提供 Nginx、Syslog 等實戰配置範例,助你輕鬆掌握日誌管理精髓。
logrotate 本身並非常駐後台的服務,而是透過 cron 排程器每日自動執行。系統預設會在 /etc/cron.daily/logrotate 放置執行腳本,內容如下:
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
執行頻率由 /etc/crontab 控制,預設每天凌晨執行一次(59 23 * * * root run-parts /etc/cron.daily)。若需調整頻率,可修改 crontab 或將腳本移至 cron.hourly 等目錄。
配置採兩層架構:
include /etc/logrotate.d 指令納入主配置,實現模組化管理。| 參數 | 說明 |
|---|---|
weekly | 每週輪替一次(預設) |
rotate 4 | 保留 4 個舊日誌檔 |
create | 輪替後建立新空檔案繼續記錄 |
dateext | 舊檔命名加上日期(如 xxx.log-20231015),否則為數字遞增 |
compress | 啟用壓縮(預設 gzip) |
minsize 1M | 檔案超過 1MB 才觸發輪替 |
sharedscripts | 多檔案共用腳本,postrotate 只執行一次 |
prerotate / endscript | 輪替前執行的命令區塊 |
postrotate / endscript | 輪替後執行的命令區塊(常用於重啟服務) |
/etc/logrotate.d/syslog)/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
sharedscripts
prerotate
/usr/bin/chattr -a /var/log/messages
endscript
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
/bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
/usr/bin/chattr +a /var/log/messages
endscript
}
解析:針對 6 個系統日誌,每週輪替、保留 4 份、不壓縮。輪替前移除 messages 的附加屬性,輪替後發送 HUP 訊號讓 syslogd/rsyslogd 重新開啟日誌檔,最後恢復屬性。
/etc/logrotate.d/nginx)/usr/local/nginx/logs/*.log {
daily
rotate 5
dateext
compress
sharedscripts
postrotate
if [ -f /usr/local/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
fi
endscript
}
解析:每日輪替、保留 5 份、加日期後綴、壓縮。輪替後發送 USR1 訊號通知 Nginx 重新開啟日誌檔(平滑重啟),無需重啟主進程。
logrotate -d /etc/logrotate.conf:除錯模式,不實際執行,輸出詳細規劃動作。logrotate -f /etc/logrotate.conf:強制執行,忽略時間條件立即輪替。logrotate -s /var/lib/logrotate/status /etc/logrotate.conf:指定狀態檔路徑。logrotate 以「配置簡單、功能強大、系統整合度高」成為 Linux 日誌管理的首選。掌握其 輪替頻率、保留份數、壓縮策略、腳本鉤子 四大核心要素,即可應對絕大多數生產環境場景。建議將各服務配置拆分至 /etc/logrotate.d/ 獨立檔案,利用 include 機制載入,保持主配置乾淨、易維護。