背景
- springboot + logback
- 日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
结论
-
application.yml
中的配置优先级高于logback.xml
中的配置,如:
logging:
level:
com.xxx: info
<logger name="com.xxx" level="debug">
<appender-ref ref="xxx"/>
</logger>
此时,com.xxx
包下的日志级别为 info
- 当某个 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,由于默认 additivity
为 true,因此会传递到 root
,但此时会以 debug 为准,故会送入到 aaa
、bbb
和 ccc
这三个 appender
中去,如果 aaa
、bbb
和 ccc
中没有设置 Filter
来过滤日志级别,那么就会得到日志输出。
- 如果没有首先命中某个 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>
建议
- 在 application.yml 中设置具体包下的日志级别
- 在 logback.xml 中设置具体包下的 appender,且不用指定日志级别
- 除控制台之外的 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/