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

Log4j2日志重复输出问题:原因排查及修复方法咨询

解决Log4j2日志重复输出的问题

嘿,我来帮你搞定这个日志重复的问题!咱们先理清楚原因,再给你两种修复方案。

问题根源

你遇到的每条日志输出两次的情况,本质是Logger的日志传递机制(Additivity)配置错误加上重复的Appender引用导致的:

  • 你同时配置了针对com.example.log4j2demo包的AsyncLogger和全局的Root根Logger,两者都绑定了ConsoleAppender和FileAppender
  • 最关键的错误是AsyncLogger的additivity属性被写成了"info"——这个属性只能是true或false,Log4j2会把非法值默认解析为true。当additivity=true时,当前Logger处理完日志后,会把日志传递给父Logger(也就是这里的RootLogger)再处理一遍,等于同一条日志被两个Logger各输出了一次,自然就重复了。

修复方案

有两种简单的解决方式,你可以根据自己的需求选:

方案一:关闭AsyncLogger的日志传递

直接把AsyncLogger的additivity设为false,这样它处理完日志后就不会再传给RootLogger了,避免重复输出:

<AsyncLogger name="com.example.log4j2demo" level="info" additivity="false">
    <AppenderRef ref="ConsoleAppender" />
    <AppenderRef ref="FileAppender" />
</AsyncLogger>
<Root level="info">
    <AppenderRef ref="ConsoleAppender" />
    <AppenderRef ref="FileAppender" />
</Root>

这种方式适合你希望RootLogger继续处理其他包的日志,而com.example.log4j2demo的日志单独由AsyncLogger处理的场景。

方案二:统一由RootLogger管理输出

如果不需要让AsyncLogger单独绑定Appender,可以去掉它的AppenderRef配置,让日志通过传递机制交给RootLogger统一输出,这样也能避免重复:

<AsyncLogger name="com.example.log4j2demo" level="info" additivity="true">
    <!-- 移除Appender引用,让日志传递给RootLogger处理 -->
</AsyncLogger>
<Root level="info">
    <AppenderRef ref="ConsoleAppender" />
    <AppenderRef ref="FileAppender" />
</Root>

这种方式更简洁,适合全局统一管理日志输出目的地的场景。

修改完配置后重启应用,再执行你的日志代码,就能看到每条日志只输出一次啦,和你期望的格式完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:07:39