Hello,你們好,我是樓下小黑哥~spring
最近被公司派去北京出差,本覺得是個輕鬆的差事,北京一週遊~app
可是沒想到第一天就是九點半下班, 大意了~框架
好了,回到正題,今天來說下最近調試項目的時候發現的一個 Logback 日誌級別設置不生效的問題。spa
事情是這樣的,咱們的項目是一個 SpringBoot 的工程的,其中日誌框架使用的是 LogBack,配置文件以下所示:debug
<configuration scan="true" scanPeriod=" 5 seconds" debug="true"> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </encoder> </appender> <logger name="org.springframework" level="DEBUG"/> <root level="debug"> <appender-ref ref="stdout"/> </root> </configuration>
爲了方便查看項目執行的 SQL,這裏我把日誌的級別調整成 DEBUG
。調試
運行的項目,執行結果比較使人驚訝,日誌僅僅輸出了 INFO
日誌,並無輸出 DEBUG
日誌。日誌
剛開始還覺得 Logback 配置文件寫的有問題,才致使這個問題。網上找了幾個例子,對比了一下,這類的配置文件並無什麼問題。code
因而進行一系列深度排查(使人頭禿),最終終於找到了問題的緣由。xml
因爲 Logback 的配置 debug=true
,項目啓動的時候,將會打印出 Logback 內部日誌信息,日誌以下:rem
從這個日誌能夠看到,Logback Root 已經設置爲 DEBUG
。
那爲何項目啓動以後,DEBUG 就失效了?
不要急,接着往下看。
當 Spring 容器啓動以後,Spring 內部將會發出一些列的 ApplicationEvent
,而後這些將會被各種已經註冊的 ApplicationListener
監聽。
因爲這個項目是一個 SpringBoot 的工程,裏面有一個 LoggingApplicationListener
將會監聽 ApplicationEnvironmentPreparedEvent
,代碼以下:
這裏面的邏輯比較簡單,獲取系統配置的日誌級別,levels
值以下:
能夠看到這裏 root 對應的值爲 info
,這裏將會繼續調用 Logback 的的方法設置日誌級別,日誌輸出以下:
上面這些日誌級別配置來自其實來自 SpringBoot 的配置文件 application.properties
最後,總結一下,SpringBoot 項目,若是使用單獨的 LogBack 配置文件,SpringBoot 的配置文件 application.properties 配置的 logging.level.root 將會覆蓋的 Logback 配置文件中的 root 的配置:
<root level="debug"> <appender-ref ref="stdout"/> </root>
問題看起來是那麼簡單,排查的過程真的是使人頭禿。