Tomcat 本身没有内置按天自动切割日志的功能,需要借助外部方式来实现。下面按常见方案和推荐程度给你说明,并附上可直接用的配置示例。
logrotate(Linux 生产环境首选)这是最常用、最稳定的方式,适合 catalina.out 这种持续写入的日志。
vim /etc/logrotate.d/tomcat
/opt/tomcat/logs/catalina.out {
daily
rotate 30
missingok
notifempty
compress
copytruncate
dateext
dateformat -%Y-%m-%d
}
| 参数 | 作用 |
|---|---|
| daily | 按天切割 |
| rotate 30 | 保留 30 天 |
| compress | 压缩旧日志 |
| copytruncate | 不重启 Tomcat(复制后清空) |
| dateext | 日志带日期后缀 |
| missingok | 日志不存在不报错 |
logrotate -d /etc/logrotate.d/tomcat
✅ 第二天即可看到类似:
catalina.out-2026-01-21.gz
cronolog(老项目常见)yum install cronolog -y
# 或
apt install cronolog -y
catalina.sh找到:
org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_OUT" 2>&1 &
修改为:
org.apache.catalina.startup.Bootstrap "$@" start \
| /usr/bin/cronolog "$CATALINA_BASE/logs/catalina.%Y-%m-%d.out" >> /dev/null 2>&1 &
✅ 效果:
catalina.2026-01-21.out
catalina.2026-01-22.out
⚠️ 缺点:需要改 Tomcat 启动脚本,升级时需注意
logging.properties(仅限 localhost_access_log)Tomcat 自带的 AccessLogValve 支持按天切割。
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"
rotatable="true"
fileDateFormat="yyyy-MM-dd" />
✅ 输出:
localhost_access_log.2026-01-21.txt
⚠️ 注意:不能切割 catalina.out
| 方案 | 原因 |
|---|---|
| 自己写 shell 定时清空 | 容易丢日志 |
| 修改 logging.properties 切 catalina.out | 不生效 |
| 用 log4j 切 catalina.out | 不适合标准 Tomcat |
| 场景 | 推荐方案 |
|---|---|
| catalina.out | ✅ logrotate |
| 访问日志 | ✅ AccessLogValve |
| 老系统 | cronolog |
| Docker | 输出到 stdout + 宿主机 logrotate |
如果你愿意,可以告诉我:
catalina.out 还是 access log我可以给你完全贴合你环境的配置。