最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何提升Tomcat日志记录效率
时间:2026-06-05 09:53:08 编辑:袖梨 来源:一聚教程网
提升 Tomcat 日志记录效率的实用方案

一 核心优化策略
- 调高日志级别,减少无用输出:在生产将多数组件日志级别设为 WARNING/ERROR,仅对问题定位阶段临时开启 FINE/FINER。在 conf/logging.properties 中调整如 org.apache.catalina.level、各类 1catalina/2localhost/3manager/4host-manager 的级别。
- 启用异步日志,降低阻塞:自 Tomcat 8 起使用 JULI 异步文件处理器,将 ConsoleHandler 替换为 org.apache.juli.AsyncFileHandler,把日志 I/O 移出业务线程,显著减少请求排队。
- 精简或优化访问日志:在 conf/server.xml 的 AccessLogValve 中按需精简 pattern、启用 rotatable 与 maxDays,或直接关闭访问日志(权衡审计与性能)。
- 规范输出,避免 System.out/异常栈滥用:减少 System.out/printStackTrace,统一走日志框架;必要时仅保留关键路径的调试信息。
- 做好轮转与清理:用 logrotate/cronolog 做按日/按大小切分、压缩与保留策略,避免 catalina.out 与访问日志无限增长。
- 必要时引入成熟日志框架:在应用侧使用 Log4j2/Logback 替代 JULI,获得更灵活的异步、异步刷新与队列控制能力。
二 关键配置示例
- 调整运行日志级别(示例)
# conf/logging.propertiesorg.apache.catalina.level = WARNINGorg.apache.catalina.startup.level = WARNING1catalina.org.apache.juli.AsyncFileHandler.level = WARNING1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.2localhost.org.apache.juli.AsyncFileHandler.level = WARNING3manager.org.apache.juli.AsyncFileHandler.level = WARNING4host-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" />- 轮转 catalina.out(示例)
# 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- 使用 logrotate 管理日志(示例)
# /etc/logrotate.d/tomcat/opt/tomcat/logs/catalina.*.out /opt/tomcat/logs/localhost_access_log.*.txt {dailymissingokrotate 30compressdelaycompresscopytruncatenotifempty}- 应用侧使用 Log4j2(示例)
<!-- 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;务必使用 异步日志;缩短保留天数并压缩归档。 |
四 验证与常见陷阱
- 验证要点
- 观察 响应时延/P95/P99 与 线程池队列 是否下降;
- 通过 iostat -x 1、vmstat 1 检查磁盘写放大与系统负载;
- 使用 jstack 与 Async Profiler 确认日志路径不再是热点;
- 核对日志是否按策略切分、压缩与清理。
- 常见陷阱
- 仅关闭控制台输出但未切换到 AsyncFileHandler,仍会阻塞业务线程;
- 访问日志 pattern 过于冗长或开启 resolveHosts,导致 DNS 查询与 I/O 放大;
- 轮转策略不当(如无压缩/无保留),引发 磁盘占满 与性能抖动;
- 应用大量 System.out/printStackTrace,难以异步且易刷盘;
- 误用 cronolog 分割 catalina.out(更适合分割标准输出流),推荐使用 logrotate 或脚本按日期重定向。
相关文章
- 在Mybatis中如何加密tenant数据 06-06
- Spring Security 如何防御常见攻击 06-06
- Linux系统日志加密方式有哪几种 06-06
- ActionForm怎样防止恶意攻击 06-06
- 2345看图王如何切换到全屏模式 06-06
- ActionForm如何处理表单数据解密 06-06