🖥️ Logrotate 日誌輪替

自動管理日誌檔案的大小與保留期

Logrotate 定期壓縮、輪替並清理舊日誌,防止日誌無限成長佔滿磁碟。幾乎所有 Linux 服務(Nginx、MySQL、syslog 等)都透過 Logrotate 管理日誌。

安裝與確認

$ sudo apt install -y logrotate
logrotate --version

# 查看 cron 排程(每天執行)
ls -la /etc/cron.daily/logrotate

Logrotate 預設由 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 只輸出它會做的動作,不實際修改任何檔案,適合在正式執行前確認設定是否正確。