LogBack 日誌等級設置無效,緣由居然是由於這個

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>

問題看起來是那麼簡單,排查的過程真的是使人頭禿。

相關文章
相關標籤/搜索