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

Log4j日志级别范围配置异常及不同级别日志重复打印问题求助

解决Log4j日志重复打印及级别范围配置问题

我太懂这种郁闷了——设置DEBUG级别后,ERROR和FATAL日志居然同时用两种格式输出,重复打印得让人头大。其实你的配置里有两个关键小问题,调整一下就能搞定:

问题根源拆解

  1. Appender属性顺序搞反了:你先写了log4j.appender.errorLog.Threshold=ERROR,才定义appender的类型,这会导致Threshold属性压根不生效,Log4j根本识别不了这个配置。
  2. 过滤器链不完整: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:51:15