背景
- springboot + logback
- 日志級(jí)別從低到高分為 TRACE < DEBUG < INFO < WARN < ERROR < FATAL
結(jié)論
-
application.yml中的配置優(yōu)先級(jí)高于logback.xml中的配置,如:
logging:
level:
com.xxx: info
<logger name="com.xxx" level="debug">
<appender-ref ref="xxx"/>
</logger>
此時(shí),com.xxx 包下的日志級(jí)別為 info
- 當(dāng)某個(gè) logger 生效后,傳遞到
root時(shí),以 logger 中的日志級(jí)別為準(zhǔn)來(lái)判斷是否發(fā)送給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>
此時(shí),雖然 root 的級(jí)別為 error,高于 debug,但是 com.xxx 包下的 debug 日志首先命中上面的 com.xxx 這個(gè) logger,由于默認(rèn) additivity 為 true,因此會(huì)傳遞到 root,但此時(shí)會(huì)以 debug 為準(zhǔn),故會(huì)送入到 aaa、bbb 和 ccc 這三個(gè) appender 中去,如果 aaa、bbb 和 ccc 中沒(méi)有設(shè)置 Filter 來(lái)過(guò)濾日志級(jí)別,那么就會(huì)得到日志輸出。
- 如果沒(méi)有首先命中某個(gè) logger 而是直接到達(dá)
root,那么此時(shí)root中的level會(huì)生效,如:
<root level="error">
<appender-ref ref="aaa"/>
<appender-ref ref="bbb"/>
<appender-ref ref="ccc"/>
</root>
此時(shí),如果 com.xxx 包中的 debug 日志則會(huì)直接到達(dá) root,此時(shí)由于 root 的日志級(jí)別為 error,因此會(huì)被攔截,不會(huì)到達(dá)里面的任意一個(gè) appender。
注意,此時(shí)如果 application.yml 中有指定級(jí)別,也相當(dāng)于先命中了一個(gè) logger,因此到達(dá) root 時(shí)還是會(huì)覆蓋其日志級(jí)別,會(huì)送入 appender,如:
logging:
level:
com.xxx: debug
<root level="error">
<appender-ref ref="aaa"/>
<appender-ref ref="bbb"/>
<appender-ref ref="ccc"/>
</root>
建議
- 在 application.yml 中設(shè)置具體包下的日志級(jí)別
- 在 logback.xml 中設(shè)置具體包下的 appender,且不用指定日志級(jí)別
- 除控制臺(tái)之外的 appender 都應(yīng)該顯式添加日志過(guò)濾級(jí)別(
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/