如何在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片段,我们逐个调整:
对于
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引用。对于
org.apache.cassandra.transport这个Logger:
你现在的配置已经有自己的QUERYLOGGERAppender,但默认还是会继承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
相关产品推荐
相关产品推荐

