提升 Tomcat 日志记录效率的实用方案
一 核心优化策略
二 关键配置示例
# conf/logging.properties
org.apache.catalina.level = WARNING
org.apache.catalina.startup.level = WARNING
1catalina.org.apache.juli.AsyncFileHandler.level = WARNING
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
2localhost.org.apache.juli.AsyncFileHandler.level = WARNING
3manager.org.apache.juli.AsyncFileHandler.level = WARNING
4host-manager.org.apache.juli.AsyncFileHandler.level = WARNING
# 将 ConsoleHandler 替换为 AsyncFileHandler(或新增 AsyncFileHandler 并加入 handlers)
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
# 可按需关闭控制台输出
java.util.logging.ConsoleHandler.level = OFF
# conf/server.xml
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log"
suffix=".txt"
rotatable="true"
maxDays="30"
pattern="%h %l %u %t \"%r\" %s %b" />
# bin/catalina.sh(或 catalina.out 重定向)
if [ -z "$CATALINA_OUT" ]; then
# 按日期切分示例(需确保目录可写)
CATALINA_OUT="$CATALINA_BASE/logs/catalina.$(date +%Y-%m-%d).out"
# 如确需关闭:CATALINA_OUT=/dev/null(不建议生产)
fi
# /etc/logrotate.d/tomcat
/opt/tomcat/logs/catalina.*.out /opt/tomcat/logs/localhost_access_log.*.txt {
daily
missingok
rotate 30
compress
delaycompress
copytruncate
notifempty
}
<!-- Maven 依赖:org.apache.logging.log4j:log4j-core, log4j-api, log4j-slf4j-impl -->
<!-- log4j2.xml -->
<Configuration status="WARN">
<Appenders>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="%d{ISO8601} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="RollingFile"/>
</Root>
</Loggers>
</Configuration>
提示:修改配置前先备份,并在非生产环境验证;变更后观察 线程阻塞、磁盘 I/O、GC 停顿 等指标是否改善。
三 按场景的配置建议
| 场景 | 建议 |
|---|---|
| 高并发生产 | 运行日志 WARNING/ERROR;访问日志仅保留必要字段并启用 rotatable/maxDays;启用 AsyncFileHandler;用 logrotate 做压缩与保留;应用侧用 Log4j2 异步 Appender。 |
| 开发/调试 | 临时将问题相关包调到 DEBUG/FINE;保留访问日志用于联调;控制台输出可开启便于实时观察。 |
| 审计合规必须保留访问日志 | 精简 pattern、开启 rotatable/maxDays、压缩归档;避免记录无用请求头;定期迁移至长期存储/数据湖。 |
| 资源受限环境(小内存/慢磁盘) | 关闭访问日志或改为采样;运行日志 ERROR;务必使用 异步日志;缩短保留天数并压缩归档。 |
四 验证与常见陷阱