如何配置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
相关产品推荐
相关产品推荐

