Tomcat日志切割策略与选型
一 常见策略总览
二 策略对比
| 策略 | 核心机制 | 优点 | 局限 | 典型场景 |
|---|---|---|---|---|
| Logrotate | 系统级定时轮转,支持时间/大小触发 | 生态成熟、功能全(压缩、保留、延迟压缩)、运维成本低 | 对 catalina.out 需选 copytruncate 或配合管道 | 生产环境通用 |
| cronolog | 进程管道按时间命名输出 | 按天命名清晰、接入简单 | 需改启动脚本、进程管道异常需守护 | 强需求按日期归档 |
| Shell + crontab | 脚本复制/清空或归档 | 无依赖、灵活 | 需处理并发与原子性、易产生小问题 | 无 root、工具缺失 |
| JULI 轮转 | JDK 日志按类文件轮转 | 与应用日志框架一致、配置直观 | 主要覆盖 JULI 日志,不处理 stdout 的 catalina.out | 与系统轮转组合使用 |
三 关键配置示例
Logrotate 示例(按天或达到 16MB 轮转,保留 7 天并压缩)
/usr/local/tomcat/logs/catalina.out {
daily
size 16M
rotate 7
missingok
compress
copytruncate
}
logrotate -d /etc/logrotate.d/tomcat # 语法检查
logrotate -f /etc/logrotate.d/tomcat # 强制执行
cronolog 示例(按日期生成 catalina.YYYY-MM-DD.out)
yum install -y cronolog(或编译安装)org.apache.catalina.startup.Bootstrap "$@" start 2>&1 \
| /usr/sbin/cronolog "$CATALINA_BASE/logs/catalina.%Y-%m-%d.out" >> /dev/null &
touch "$CATALINA_OUT" 以避免与管道写入冲突;重启 Tomcat 生效。Shell 脚本 + crontab 示例(复制并清空 catalina.out,保留 7 天)
#!/usr/bin/env bash
set -e
LOG_DIR=/opt/tomcat/logs
cd "$LOG_DIR"
TODAY=$(date +%F)
OLD=$(date -d '7 days ago' +%F)
cp catalina.out "catalina.out.$TODAY"
: > catalina.out
rm -f "catalina.out.$OLD"
59 23 * * * /opt/scripts/tomcat-log-rotate.sh >> /var/log/tomcat-rotate.log 2>&1
四 选型与落地建议
touch "$CATALINA_OUT" 的冲突处理。