You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat 9如何通过logging.properties实现日志轮转与自动删除?

Tomcat 9 日志轮转与自动删除配置问题解决

问题确认

完全可以通过logging.properties实现日志每日轮转+自动删除20天前旧日志的需求,你当前配置失效的核心原因是混淆了AccessLogValve(server.xml中配置)与JULI AsyncFileHandler(logging.properties中配置)的生效逻辑,虽然参数名看似一致,但两者的触发条件和底层执行逻辑存在差异。

配置修正与生效要点

你的参数名本身是正确的,但需要注意以下几点确保配置生效:

1. 确认配置文件路径与加载优先级

确保logging.properties放在${catalina.base}/conf/目录下(而非全局的${catalina.home}/conf/,除非你未配置单独的实例目录)。Tomcat启动时优先加载实例目录下的配置,全局配置会被实例配置覆盖。

2. 显式配置日期格式(强化按天轮转逻辑)

虽然默认日期格式为yyyy-MM-dd(按天轮转),但显式配置dateFormat可以确保轮转逻辑严格按预期触发,避免因环境差异导致的异常:

1catalina.org.apache.juli.AsyncFileHandler.dateFormat = yyyy-MM-dd

将上述配置添加到每个AsyncFileHandler的配置块中。

3. 检查日志目录权限

确保Tomcat运行用户对${catalina.base}/logs目录拥有读写、重命名权限——权限不足会直接导致日志无法轮转,删除逻辑也会失效。

4. 明确AsyncFileHandler参数逻辑

Tomcat 9的AsyncFileHandler完全支持rotatable=true(默认开启)和maxDays=20参数,但需注意:

  • maxDays的清理逻辑在每次日志轮转时触发,自动删除超过指定天数的旧日志
  • 异步日志的轮转存在轻微延迟,不会像AccessLogValve那样严格按整点触发,但最终会完成轮转与清理

修正后的完整logging.properties示例

handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.rotatable = true
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 20
1catalina.org.apache.juli.AsyncFileHandler.dateFormat = yyyy-MM-dd
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.rotatable = true
2localhost.org.apache.juli.AsyncFileHandler.maxDays = 20
2localhost.org.apache.juli.AsyncFileHandler.dateFormat = yyyy-MM-dd
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.rotatable = true
3manager.org.apache.juli.AsyncFileHandler.maxDays = 20
3manager.org.apache.juli.AsyncFileHandler.dateFormat = yyyy-MM-dd
3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.rotatable = true
4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 20
4host-manager.org.apache.juli.AsyncFileHandler.dateFormat = yyyy-MM-dd
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8

排查步骤(若配置后仍失效)

  • 重启Tomcat,观察logs目录是否生成带日期后缀的日志文件
  • 查看Tomcat启动日志(catalina.out或控制台输出),检查是否存在日志配置相关报错
  • 临时修改系统日期(仅测试用),触发轮转逻辑,验证是否生成新日志并删除旧日志

内容的提问来源于stack exchange,提问作者codeMode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:36:17