Linux下Tomcat日志轮转策略
导读:Linux下Tomcat日志轮转策略 一 常用方案与适用场景 logrotate 系统工具:适合绝大多数场景,配置简单、与系统定时任务集成,可同时管理 catalina.out 与按日期生成的 catalina.yyyy-mm-dd.lo...
Linux下Tomcat日志轮转策略
一 常用方案与适用场景
- logrotate 系统工具:适合绝大多数场景,配置简单、与系统定时任务集成,可同时管理 catalina.out 与按日期生成的 catalina.yyyy-mm-dd.log 等文件。支持按天、按大小、压缩、保留份数、延迟压缩、日期后缀等策略。
- cronolog 管道切割:通过修改 bin/catalina.sh,将标准输出交给 cronolog 按日期自动创建新文件,天然按天分割,无需后续轮转。
- JULI + Log4j 方案:替换或增强 Tomcat 内建日志,使用 FileHandler.limit/count/pattern 或 Log4j 的 DailyRollingFileAppender 等实现按大小/按天滚动与保留策略。
- Shell 脚本 + find 清理:作为补充手段,定期删除过期日志,适合清理历史归档或访问日志。
以上方案可单独或组合使用,以满足“按天/按大小/保留N天/压缩归档”的合规与容量治理目标。
二 推荐方案 logrotate 配置示例
- 针对 catalina.out(不中断写入,优先选用 copytruncate)
/opt/tomcat/logs/catalina.out {
daily
rotate 30
size 100M
copytruncate
compress
delaycompress
missingok
notifempty
dateext
dateformat -%Y-%m-%d
create 0644 tomcat tomcat
}
- 针对 按日期已分割的 catalina 日志(如 catalina.2025-12-15.log)
/opt/tomcat/logs/catalina.*.log {
daily
rotate 30
compress
missingok
notifempty
dateext
dateformat -%Y-%m-%d
sharedscripts
postrotate
# 可选:通知或重启相关进程;多数情况下无需重启
endscript
}
- 多实例通配(如 /opt/tomcat-*/logs/catalina.out)
/opt/tomcat-*/logs/catalina.out {
su root root
daily
rotate 15
missingok
dateext
compress
notifempty
copytruncate
size 20M
}
- 调试与强制执行
- 调试:logrotate -d /etc/logrotate.d/tomcat
- 强制执行:logrotate -f /etc/logrotate.d/tomcat
说明:系统通常通过 /etc/cron.daily/logrotate 每日调用 /usr/sbin/logrotate /etc/logrotate.conf 自动执行;如业务需要更频繁轮转,可在 crontab 中单独调度该配置。
三 cronolog 按日期切割 catalina.out
- 安装(示例)
- CentOS/RHEL:yum install -y cronolog
- 或编译安装后确保可执行文件在 /usr/sbin/cronolog
- 修改 bin/catalina.sh 中的启动行(有两处,需一致)
org.apache.catalina.startup.Bootstrap "$@" start 2>
&
1 \
| /usr/sbin/cronolog "$CATALINA_BASE"/logs/catalina.out-%Y-%m-%d.log >
>
/dev/null &
- 重启 Tomcat 后,将在 logs/ 下生成如 catalina.out-2025-12-15.log 的按日文件,后续无需再对 catalina.out 做轮转。
提示:若之前有“touch catalina.out”等初始化,可按需注释,避免空文件干扰。
四 按大小或数量轮转的 JULI 与 Log4j 配置
- JULI FileHandler(Tomcat 内建日志)
# 在 conf/logging.properties 中调整或新增
java.util.logging.FileHandler.limit = 10485760 # 10MB
java.util.logging.FileHandler.count = 10 # 保留10个
java.util.logging.FileHandler.pattern = /opt/tomcat/logs/catalina.%g.out
.handlers = java.util.logging.FileHandler
- Log4j 1.x DailyRollingFileAppender(示例)
log4j.rootLogger=INFO, CATALINA
log4j.appender.CATALINA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File=/opt/tomcat/logs/catalina.log
log4j.appender.CATALINA.DatePattern='.'yyyy-MM-dd
log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern=%d{
yyyy-MM-dd HH:mm:ss}
%-5p %c{
1}
:%L - %m%n
- 使用 Log4j 接管 stdout/stderr 时,需在 conf/context.xml 设置 swallowOutput=“true”,并确保相关 JAR(如 tomcat-juli.jar、tomcat-juli-adapters.jar、log4j-*.jar)就位,再按需移除或调整 logging.properties 与 catalina.sh 中的重定向。
说明:JULI 的 limit/count 适合“按大小+数量”的滚动;Log4j 的 DailyRollingFileAppender 适合“按天”滚动。
五 运维要点与常见问题
- 选择策略:对 catalina.out 优先用 copytruncate 以避免重启;对按日期生成的日志用 dateext 命名并配合 compress/delaycompress 节省空间。
- 权限与属主:确保 create 指定的用户/组与 Tomcat 运行账号一致(如 tomcat:tomcat),避免轮转后无法写入。
- 多实例管理:使用通配路径(如 /opt/tomcat-*/logs/)或在 /etc/logrotate.d/ 下为每个实例单独配置,便于差异化保留策略。
- 清理历史归档:对访问日志或历史 catalina 文件,可用 find … -mtime +N -delete 定期清理,示例:
- 0 2 * * * find /opt/tomcat-/logs -name 'localhost_access_log.’ -mtime +7 -delete
- 避免重复切割:若已用 cronolog 按天生成文件,通常不再对同名文件做 logrotate 切割;可改为仅对归档做压缩与过期清理。
- 验证与回滚:上线前用 logrotate -d 做语法与执行模拟,必要时 -f 强制演练;保留回滚方案与变更记录。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux下Tomcat日志轮转策略
本文地址: https://pptw.com/jishu/771903.html
