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

如何在Logback中覆盖Logger继承自root的Appender?

如何在Logback中覆盖Logger继承自root的Appender

嘿,这个问题我太熟悉了!在Logback里要让Logger不继承root(或者上级Logger)的Appender,关键就在于**additivity属性**——这是控制日志事件是否向上传递的核心开关。

核心原理

默认情况下,Logback的Logger的additivity属性是true,也就是说:

  • 这个Logger的日志会先交给自己配置的Appender处理
  • 同时还会把日志事件传递给上级Logger(包括root)的Appender,导致日志重复输出

如果想完全覆盖继承自root的Appender,只让Logger使用自己定义的Appender,只需要把additivity设为false即可。

结合你的配置示例修改

看你给出的logback.xml片段,我们逐个调整:

  1. 对于com.thinkaurelius.thrift这个Logger:
    你现在的配置是:

    <logger name="com.thinkaurelius.thrift" level="ERROR"/>
    

    它没有自己的Appender,默认会用root的FILE和STDOUT输出。如果不想让它用root的Appender,就改成:

    <logger name="com.thinkaurelius.thrift" level="ERROR" additivity="false"/>
    

    注意:这样改之后,如果不给它配置自己的<appender-ref>,这个Logger的日志会直接丢失(因为没有输出目标),所以如果需要输出,记得加上对应的Appender引用。

  2. 对于org.apache.cassandra.transport这个Logger:
    你现在的配置已经有自己的QUERYLOGGER Appender,但默认还是会继承root的FILE和STDOUT,导致日志重复输出。要覆盖继承的话,只需要加上additivity="false":

    <logger name="org.apache.cassandra.transport" level="DEBUG" additivity="false">
        <appender-ref ref="QUERYLOGGER" />
    </logger>
    

    这样修改后,这个Logger的日志只会通过QUERYLOGGER输出,不会再用root的两个Appender了。

额外注意事项

  • additivity是针对整个Logger的,没法单独排除某个root的Appender(比如只去掉FILE保留STDOUT)。如果需要这种精细化控制,得在root的Appender里加过滤器,或者给Logger配置自己的Appender并调整过滤规则。
  • 如果你只是想调整Logger的日志级别,不需要覆盖Appender的话,不用改additivity——级别调整和Appender继承是独立的配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:36:35