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

Tomcat 7下Log4j日志重复输出至文件与catalina.out的解决咨询

解决Tomcat7中Log4j日志同时输出到指定文件和catalina.out的重复问题

嘿,这个重复日志的问题我之前维护老项目时也碰到过,核心原因和Log4j的日志继承机制、Tomcat的默认输出重定向有关,咱们一步步来搞定它~

问题根源分析

  1. Log4j的日志继承特性:你配置的ge.mycompany.packageone和ge.mycompany.packagetwo.api这两个子Logger默认开启了additivity=true(继承属性),意味着它们的日志会同时发送给自己绑定的Appender(MT、MTAPI),还会向上传递给父Logger(rootLogger)的CONSOLE Appender。
  2. Tomcat的输出捕获:Tomcat默认会把System.out和System.err的内容重定向到catalina.out,而你的CONSOLE Appender正好输出到控制台(本质就是System.out),所以这部分日志会被Tomcat再写入一次catalina.out,最终造成重复。

解决方案:关闭子Logger的继承属性

只需要在你的log4j.properties中给这两个子Logger添加additivity=false配置,阻止它们的日志向上传递给rootLogger即可。

修改后的完整配置

log4j.debug=TRUE
log4j.rootLogger=DEBUG, CONSOLE
log4j.category.org.jboss.resteasy=INFO

# 配置子Logger并关闭继承属性
log4j.category.ge.mycompany.packageone=DEBUG, MT
log4j.additivity.ge.mycompany.packageone=false
log4j.category.ge.mycompany.packagetwo.api=DEBUG, MTAPI
log4j.additivity.ge.mycompany.packagetwo.api=false

# 控制台Appender配置
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss.SSSS} %p %t %c %m%n

# MT服务日志Appender
log4j.appender.MT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MT.File=/opt/tomcat/apache-tomcat-7.0.35/logs/first-file.log
log4j.appender.MT.DatePattern ='.'yyyy-MM-dd
log4j.appender.MT.layout=org.apache.log4j.PatternLayout
log4j.appender.MT.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss.SSSS} %p %t %c %m%n

# MTAPI服务日志Appender
log4j.appender.MTAPI=org.apache.log4j.DailyRollingFileAppender
log4j.appender.MTAPI.File=/opt/tomcat/apache-tomcat-7.0.35/logs/secont-file-api.log
log4j.appender.MTAPI.DatePattern ='.'yyyy-MM-dd
log4j.appender.MTAPI.layout=org.apache.log4j.PatternLayout
log4j.appender.MTAPI.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss.SSSS} %p %t %c %m%n

额外说明

  • 如果之后发现某些框架的日志还是出现在catalina.out里,可以检查对应Logger是否也需要关闭继承属性,或者调整rootLogger的级别(比如把rootLogger设为INFO,过滤掉DEBUG级别的框架日志)。
  • 要是你不需要控制台输出,也可以直接移除rootLogger中的CONSOLE Appender,但开发调试时可能不太方便,所以更推荐保留控制台输出+关闭子Logger继承的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:36:30