Logrotate 是 Linux 系統日誌管理的標準工具,透過 cron 定時執行,實現日誌切割、壓縮、保留、郵件通知、腳本觸發等自動化流程。本文深度解析運作原理、核心配置指令、/etc/logrotate.d 模組化管理、Nginx 實戰配置範例。
/etc/cron.daily/logrotate 每日觸發(預設 23:59)/etc/logrotate.conf 與 /etc/logrotate.d/ 下所有檔案| 指令 | 說明 | 預設值 |
|---|---|---|
daily/weekly/monthly | 輪轉頻率 | weekly |
rotate N | 保留輪轉份數 | 4 |
create [mode] [owner] [group] | 輪轉後建立新檔案權限/擁有者 | — |
dateext | 輪轉檔案後綴用日期格式 (如 -20240125) | 數字遞增 .1 |
compress | 輪轉檔案壓縮 (gzip) | 不壓縮 |
delaycompress | 延遲壓縮到下一次輪轉 | — |
missingok | 日誌檔不存在不報錯 | — |
notifempty | 空檔案不輪轉 | — |
minsize N | 檔案大小超過 N 才輪轉 | — |
size N | 檔案大小達 N 強制輪轉 (忽略時間) | — |
sharedscripts | 多檔案共用 prerotate/postrotate 腳本 | — |
prerotate ... endscript | 輪轉前執行腳本 | — |
postrotate ... endscript | 輪轉後執行腳本 (常用 reload 服務) | — |
/etc/logrotate.confweekly
rotate 4
create
dateext
compress
include /etc/logrotate.d
/var/log/wtmp {
monthly
minsize 1M
create 0664 root utmp
rotate 1
}
/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
sharedscripts
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
}
關鍵點:sharedscripts 確保多檔案僅觸發一次腳本;postrotate 發送 SIGHUP 讓 syslog 重新開啟日誌檔;chattr +a 保護日誌只能追加。
建立 /etc/logrotate.d/nginx:
/usr/local/nginx/logs/*.log {
daily # 每日輪轉
rotate 5 # 保留 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
}
解析:Nginx 收到 SIGUSR1 會重新開啟日誌檔案,無需重啟服務,實現零停機輪轉。
# 測試配置語法 (不實際執行)
logrotate -d /etc/logrotate.conf
# 強制執行一次 (忽略時間條件)
logrotate -f /etc/logrotate.conf
# 查看狀態檔
cat /var/lib/logrotate/status
/etc/logrotate.d/ 模組化管理,每服務一檔dateext + compress,利於歸檔查詢rotate 30 以上,配合集中日誌系統postrotate 必須發送正確信號讓服務重開檔案描述符mail root 異常通知/var/lib/logrotate/status 確認輪轉正常
上一頁 1 2 3 下一頁 共 3 頁