Tomcat 7下Log4j日志重复输出至文件与catalina.out的解决咨询
解决Tomcat7中Log4j日志同时输出到指定文件和catalina.out的重复问题
嘿,这个重复日志的问题我之前维护老项目时也碰到过,核心原因和Log4j的日志继承机制、Tomcat的默认输出重定向有关,咱们一步步来搞定它~
问题根源分析
- Log4j的日志继承特性:你配置的
ge.mycompany.packageone和ge.mycompany.packagetwo.api这两个子Logger默认开启了additivity=true(继承属性),意味着它们的日志会同时发送给自己绑定的Appender(MT、MTAPI),还会向上传递给父Logger(rootLogger)的CONSOLE Appender。 - 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
相关产品推荐
相关产品推荐

