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

如何配置LogBack为每个Logger创建独立的Appender实例?

解决Logback中多个Logger共享同一Appender实例的问题

你的问题正好戳中了Logback的一个默认行为:所有引用同一个<appender>配置的Logger,都会共享这个Appender的单实例。这就是为什么两个监听器都被加到了同一个LogListenerAppender里,导致TestLogger的日志触发了两个监听器的输出,listeners.size()也变成了2。

最简便的解决方案不需要修改Java代码,只需要调整Logback的配置即可:

步骤1:修改logback.xml的Appender配置

在你的LISTENER Appender标签里添加scope="prototype"属性,告诉Logback每次有Logger引用这个Appender时,都创建一个全新的实例:

<!--Custom Listener Appender-->
<appender name="LISTENER" class="path.to.LogListenerAppender" scope="prototype"/>

步骤2:验证效果

修改配置后重新运行代码:

  • TestLogger和MainLogger会各自拥有独立的LogListenerAppender实例
  • 调用addListenerToLogger时,每个监听器只会被添加到对应Logger的专属Appender中
  • listeners.size()会打印两次1(每个Appender实例各绑定一个监听器)
  • 最终testLogger.info("Hello")只会输出TEST LOG: Hello,完全符合你的预期

为什么这个方案有效?

Logback默认把Appender作为单例(scope="singleton")管理,不管多少个Logger引用,只会初始化一次。而scope="prototype"会改变这个行为:每次Logger请求绑定该Appender时,Logback都会创建一个新的Appender实例,完美匹配你“每个Logger使用独立Appender”的需求。

如果之后需要对不同Logger的Appender做差异化配置(比如不同的默认级别),还可以基于这个思路,结合Logback的变量或条件配置进一步扩展,但就当前需求而言,scope="prototype"是最简洁的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 03:42:49