Log4j日志级别范围配置异常及不同级别日志重复打印问题求助
解决Log4j日志重复打印及级别范围配置问题
我太懂这种郁闷了——设置DEBUG级别后,ERROR和FATAL日志居然同时用两种格式输出,重复打印得让人头大。其实你的配置里有两个关键小问题,调整一下就能搞定:
问题根源拆解
- Appender属性顺序搞反了:你先写了
log4j.appender.errorLog.Threshold=ERROR,才定义appender的类型,这会导致Threshold属性压根不生效,Log4j根本识别不了这个配置。 - 过滤器链不完整:
infoLog只配了LevelRangeFilter,但Log4j的过滤器规则是:如果过滤器返回NEUTRAL(超出指定范围的日志会返回这个),appender默认会处理这些日志,所以ERROR/FATAL就被infoLog意外输出了。
修正后的完整配置
log4j.rootLogger=DEBUG, infoLog, errorLog # 仅处理DEBUG到INFO级别的日志,拒绝ERROR/FATAL log4j.appender.infoLog=org.apache.log4j.ConsoleAppender log4j.appender.infoLog.Target=System.out log4j.appender.infoLog.layout=org.apache.log4j.PatternLayout log4j.appender.infoLog.layout.ConversionPattern=%m%n # 配置LevelRangeFilter限定日志级别范围 log4j.appender.infoLog.filter.a=org.apache.log4j.varia.LevelRangeFilter log4j.appender.infoLog.filter.a.LevelMin=DEBUG log4j.appender.infoLog.filter.a.LevelMax=INFO log4j.appender.infoLog.filter.a.AcceptOnMatch=true # 关键:添加DenyAllFilter拒绝所有不在范围内的日志 log4j.appender.infoLog.filter.b=org.apache.log4j.varia.DenyAllFilter # 处理ERROR及以上级别日志,调整属性顺序确保Threshold生效 log4j.appender.errorLog=org.apache.log4j.ConsoleAppender log4j.appender.errorLog.Threshold=ERROR log4j.appender.errorLog.Target=System.out log4j.appender.errorLog.layout=org.apache.log4j.PatternLayout log4j.appender.errorLog.layout.ConversionPattern=\u001b[31;1m%d{yyyy-MM-dd HH:mm:ss} [%-5p] %c{1}:%M():%L - %m%n
核心改动说明
- 调整errorLog配置顺序:先定义appender类型,再设置
Threshold=ERROR,确保Log4j正确加载这个属性,只处理ERROR及以上的日志。 - 新增DenyAllFilter:在infoLog的过滤器链最后加上这个,把所有不在DEBUG到INFO范围内的日志直接拒绝,彻底避免ERROR/FATAL被infoLog输出。
- 明确LevelRangeFilter参数:通过
LevelMin和LevelMax严格限定范围,AcceptOnMatch=true确保只接受指定级别的日志。
这样配置后,DEBUG和INFO日志会通过infoLog输出,ERROR和FATAL只会通过errorLog输出,再也不会出现重复打印的情况啦。
内容的提问来源于stack exchange,提问作者Divyansh Goel
相关产品推荐
相关产品推荐

