关于 logback.xml 中 root level 生效问题的记录

背景

  • springboot + logback
  • 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL

结论

  1. application.yml 中的配置优先级高于 logback.xml 中的配置,如:
logging:
  level:
    com.xxx: info
<logger name="com.xxx" level="debug">
    <appender-ref ref="xxx"/>
</logger>

此时,com.xxx 包下的日志级别为 info

  1. 当某个 logger 生效后,传递到 root 时,以 logger 中的日志级别为准来判断是否发送给 appender,如:
<logger name="com.xxx" level="debug">
    <appender-ref ref="xxx"/>
</logger>
<root level="error">
    <appender-ref ref="aaa"/>
    <appender-ref ref="bbb"/>
    <appender-ref ref="ccc"/>
</root>

此时,虽然 root 的级别为 error,高于 debug,但是 com.xxx 包下的 debug 日志首先命中上面的 com.xxx 这个 logger,由于默认 additivitytrue,因此会传递到 root,但此时会以 debug 为准,故会送入到 aaabbbccc 这三个 appender 中去,如果 aaabbbccc 中没有设置 Filter 来过滤日志级别,那么就会得到日志输出。

  1. 如果没有首先命中某个 logger 而是直接到达 root,那么此时 root 中的 level 会生效,如:
<root level="error">
    <appender-ref ref="aaa"/>
    <appender-ref ref="bbb"/>
    <appender-ref ref="ccc"/>
</root>

此时,如果 com.xxx 包中的 debug 日志则会直接到达 root,此时由于 root 的日志级别为 error,因此会被拦截,不会到达里面的任意一个 appender

注意,此时如果 application.yml 中有指定级别,也相当于先命中了一个 logger,因此到达 root 时还是会覆盖其日志级别,会送入 appender,如:

logging:
  level:
    com.xxx: debug
<root level="error">
    <appender-ref ref="aaa"/>
    <appender-ref ref="bbb"/>
    <appender-ref ref="ccc"/>
</root>

建议

  1. 在 application.yml 中设置具体包下的日志级别
  2. 在 logback.xml 中设置具体包下的 appender,且不用指定日志级别
  3. 除控制台之外的 appender 都应该显示添加日志过滤级别(ch.qos.logback.classic.filter.LevelFilter 或者 ch.qos.logback.classic.filter.ThresholdFilter

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容