🖥️ Logrotate 日誌輪替
自動管理日誌檔案的大小與保留期
Logrotate 定期壓縮、輪替並清理舊日誌,防止日誌無限成長佔滿磁碟。幾乎所有 Linux 服務(Nginx、MySQL、syslog 等)都透過 Logrotate 管理日誌。
安裝與確認
$ sudo apt install -y logrotate
logrotate --version
# 查看 cron 排程(每天執行)
ls -la /etc/cron.daily/logrotateLogrotate 預設由 cron 每天執行一次。系統服務的設定放在 /etc/logrotate.d/,自訂設定也放這裡。
設定語法
# 全域預設設定(/etc/logrotate.conf)
weekly # 輪替頻率
rotate 4 # 保留 4 份舊日誌
create # 輪替後建立空的新日誌
compress # 壓縮舊日誌(gzip)
# 引用 /etc/logrotate.d/ 的所有設定
include /etc/logrotate.d為自訂應用建立輪替設定
$ sudo vim /etc/logrotate.d/myapp/var/log/myapp/*.log {
daily # 每天輪替
rotate 30 # 保留 30 份(30 天的日誌)
compress # 壓縮舊日誌(.gz)
delaycompress # 保留最新一份舊日誌不壓縮(方便即時查看)
missingok # 如果日誌不存在,不報錯
notifempty # 如果日誌是空的,不輪替
create 0644 www-data www-data # 輪替後建立的新日誌的權限和擁有者
dateext # 舊日誌加上日期後綴(如 app.log-20260520.gz)
maxsize 100M # 超過 100MB 就輪替,無論時間
# 輪替完成後通知應用重新打開日誌
postrotate
systemctl reload myapp 2>/dev/null || true
endscript
}Nginx 的 Logrotate 設定(範例)
/var/log/nginx/*.log {
daily
missingok
rotate 52 # 保留 52 天
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts # 多個日誌檔時,postrotate 只執行一次
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid` # Nginx 重新打開日誌
fi
endscript
}常用選項說明
| 選項 | 說明 |
|---|---|
daily / weekly / monthly / yearly | 輪替頻率 |
rotate N | 保留 N 份舊日誌 |
compress | 使用 gzip 壓縮 |
compresscmd bzip2 | 改用 bzip2 壓縮 |
delaycompress | 最新一份舊日誌不壓縮 |
missingok | 日誌不存在不報錯 |
notifempty | 空日誌不輪替 |
dateext | 舊日誌加日期後綴 |
maxsize SIZE | 超過大小就輪替(無視時間) |
size SIZE | 只有超過大小才輪替(忽略時間條件) |
sharedscripts | 多個匹配檔案只執行一次 pre/postrotate |
copytruncate | 複製後清空原日誌(不需程序支援重新打開) |
測試與手動執行
$ # 測試設定(不實際執行)
sudo logrotate -d /etc/logrotate.d/myapp
# 強制手動執行(即使不符合輪替時間條件)
sudo logrotate -f /etc/logrotate.d/myapp
# 執行所有設定(模擬今天的例行輪替)
sudo logrotate /etc/logrotate.conf
# 查看上次執行記錄
cat /var/lib/logrotate/status | grep myapp
使用
-d(debug)選項時,Logrotate 只輸出它會做的動作,不實際修改任何檔案,適合在正式執行前確認設定是否正確。