Tomcat日志切割与归档方法
导读:Tomcat日志切割与归档方法 一 常用方案总览 下表对比三种主流做法,便于按环境选择: 方案 适用场景 关键要点 优点 注意点 logrotate 系统自带、统一运维管理 对catalina.out使用 copytrun...
Tomcat日志切割与归档方法
一 常用方案总览
- 下表对比三种主流做法,便于按环境选择:
| 方案 | 适用场景 | 关键要点 | 优点 | 注意点 |
|---|---|---|---|---|
| logrotate | 系统自带、统一运维管理 | 对catalina.out使用 copytruncate,按天轮转并压缩归档 | 简单、稳定、与系统日志策略一致 | 需理解 copytruncate 与 create 的差异 |
| cronolog | 希望按时间自动命名输出 | 在 catalina.sh 将 stdout/stderr 通过管道交给 cronolog | 按日生成文件,无需额外轮转工具 | 修改启动脚本,注意路径与权限 |
| Log4j 按天切分 | 应用侧精细控制 | 使用 DailyRollingFileAppender 输出到 catalina、localhost 等 | 灵活、可定制格式与级别 | 需引入 log4j 相关 jar 并调整配置 |
以上三种方式均为业界常用做法,可单独或组合使用(例如:cronolog 负责 catalina.out,Log4j 负责业务日志)。
二 方案一 Logrotate 切割 catalina.out(系统自带,推荐)
- 基本配置示例(创建文件:/etc/logrotate.d/tomcat)
/path/to/tomcat/logs/catalina.out {
daily
rotate 30
missingok
dateext
compress
notifempty
copytruncate
}
- 关键参数说明
- daily/weekly/monthly:按天/周/月轮转
- rotate N:保留最近 N 个归档
- dateext:归档后缀加日期(如:catalina.out-2025-12-15)
- compress:用 gzip 压缩归档
- copytruncate:复制当前日志并截断,适用于被进程持续打开的文件(如 catalina.out)
- missingok:日志不存在时不报错
- notifempty:空文件不轮转
- 测试与执行
- 预演:/usr/sbin/logrotate -d /etc/logrotate.d/tomcat
- 强制执行:/usr/sbin/logrotate -f /etc/logrotate.d/tomcat
- 执行时间说明
- logrotate 通常由 /etc/cron.daily/logrotate 触发,实际执行时间由系统的 cron/anacron 决定;如需自定义时间,可在 crontab 中直接调度 logrotate(例如每天 23:59 执行)。
三 方案二 Cronolog 按时间命名 catalina.out
- 安装 cronolog
- CentOS/RHEL:yum install -y cronolog
- 或源码安装:./configure & & make & & make install,默认路径常为 /usr/local/sbin/cronolog
- 修改 Tomcat 启动脚本(bin/catalina.sh)
- 备份原文件:cp catalina.sh catalina.sh.bak
- 找到执行 nohup 的一行,将标准输出通过管道交给 cronolog,例如:
org.apache.catalina.startup.Bootstrap "$@" start 2>
&
1 \
| /usr/local/sbin/cronolog "$CATALINA_BASE/logs/catalina-%Y-%m-%d.out" >
>
/dev/null &
- 可选:注释或删除脚本中创建 $CATALINA_OUT 的 touch 语句,避免冲突
- 重启 Tomcat
- 生效后将在 logs/ 下生成按日期命名的文件(如:catalina-2025-12-15.out)
- 说明
- 该方式直接让 Tomcat 按日期输出,无需后续轮转;若需压缩归档,可配合系统的 logrotate 对生成的 .out 文件再做压缩与清理。
四 方案三 Log4j 按天切分 Tomcat 内部日志
- 适用:希望 catalina、localhost、manager、host-manager 等内部日志也按天切分
- 步骤
- 将依赖放入 $CATALINA_HOME/lib:log4j-1.2.17.jar、tomcat-juli.jar、tomcat-juli-adapters.jar
- 在 $CATALINA_HOME/lib/ 新建 log4j.properties(示例):
log4j.rootLogger=INFO, CATALINA
log4j.appender.CATALINA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File=${
catalina.base}
/logs/catalina
log4j.appender.CATALINA.Append=true
log4j.appender.CATALINA.Encoding=UTF-8
log4j.appender.CATALINA.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout=org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
log4j.appender.LOCALHOST=org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File=${
catalina.base}
/logs/localhost
log4j.appender.LOCALHOST.Append=true
log4j.appender.LOCALHOST.Encoding=UTF-8
log4j.appender.LOCALHOST.DatePattern='.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout=org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern=%d [%t] %-5p %c- %m%n
# 可按需添加 MANAGER / HOST-MANAGER
- 使 Tomcat 使用 Log4j:在 conf/context.xml 的 上添加属性:swallowOutput=“true”,并删除或重命名 conf/logging.properties(避免 JUL 与 log4j 冲突)
- 重启 Tomcat 后,catalina、localhost 等将生成按日期切分的日志文件。
五 归档与清理实践
- 自动清理旧日志
- 使用 find 定期删除 N 天前的 .log/.gz 文件(示例保留 30 天):
find /path/to/tomcat/logs -type f \( -name "*.log" -o -name "*.gz" \) -mtime +30 -delete
- 加入 crontab 每日执行(如 00:00):
0 0 * * * /usr/bin/find /path/to/tomcat/logs -type f \( -name "*.log" -o -name "*.gz" \) -mtime +30 -delete
- 备份归档
- 将归档日志打包并转移到备份目录或对象存储(示例):
tar czvf /backup/tomcat_logs_$(date +%F).tar.gz -C /path/to/tomcat/logs .
- 注意事项
- 清理或迁移前建议先备份;清理大量日志时避免一次性删除过多文件,分批进行更稳妥
- 若使用 copytruncate,无需重启 Tomcat;若改用 create 方式,可能需要发送信号让应用重新打开日志文件(Tomcat 使用 JUL 时通常配合 swallowOutput 与 Log4j 更顺畅)。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Tomcat日志切割与归档方法
本文地址: https://pptw.com/jishu/771904.html
