关于 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

参考

  • LoggingSystem.java
  • LogbackLoggingSystem.java
  • LoggingApplicationListener.java
  • https://blog.csdn.net/shanvlang/article/details/120196979
  • https://github.com/qos-ch/logback
  • https://logback.qos.ch/documentation.html
  • https://www.slf4j.org/
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容