Tomcat catalina.out 會無限增長佔滿磁碟。logrotate 透過 copytruncate 在不重啟 Tomcat、不中斷寫入的前提下完成日誌切割、壓縮、保留。本文給出生產環境就緒的設定檔與驗證步驟。

# ls -lh /usr/local/tomcat/logs/catalina.out
-rw-r--r-- 1 www www 14M Aug 28 15:55 catalina.out
# /etc/logrotate.d/tomcat
/usr/local/tomcat/logs/catalina.out {
daily # 每日輪轉
rotate 5 # 保留 5 份輪轉檔
missingok # 檔案不存在不報錯
dateext # 使用日期後綴 (catalina.out-20240520)
compress # 壓縮舊檔 (gzip)
notifempty # 空檔不輪轉
copytruncate # 關鍵:複製後清空原檔,不需重啟 Tomcat
# create 640 www www # 若用 create 模式需重啟 Tomcat 重開檔案描述符
}
| 參數 | 作用 |
|---|---|
copytruncate | cp 原檔 → 截斷原檔為 0,檔案描述符不變,應用無感繼續寫入 |
dateext | 輪轉檔命名為 catalina.out-20240520.gz 而非 .1.gz |
compress | 預設 gzip,可加 compresscmd xz 改用 xz |
delaycompress | 延遲一輪再壓縮,方便即時分析最新舊檔 |
# 強制執行一次 (除錯模式)
logrotate -d /etc/logrotate.d/tomcat
# 實際執行
logrotate -f /etc/logrotate.d/tomcat
# 檢查結果
ls -lh /usr/local/tomcat/logs/
# 應出現 catalina.out-20240520.gz 且 catalina.out 大小歸零
# /etc/systemd/system/logrotate-tomcat.timer
[Unit]
Description=Daily Tomcat log rotation
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
# /etc/systemd/system/logrotate-tomcat.service
[Unit]
Description=Rotate Tomcat logs
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/logrotate.d/tomcat
systemctl daemon-reload
systemctl enable --now logrotate-tomcat.timer
配置完成後,Tomcat 日誌將自動每日切割、壓縮、保留 5 天,零維運負擔。