一個令人頭禿的問題,Logback 日志級別設(shè)置竟然無效?
來源 | 樓下小黑哥(ID:US_stocks)
最近被公司派去北京出差,本以為是個輕松的差事,北京一周游~
但是沒想到第一天就是九點半下班, 大意了~

好了,回到正題,今天來講下最近調(diào)試項目的時候發(fā)現(xiàn)的一個 Logback 日志級別設(shè)置不生效的問題。
問題背景
事情是這樣的,我們的項目是一個 SpringBoot 的工程的,其中日志框架使用的是 LogBack,配置文件如下所示:
<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>
為了方便查看項目執(zhí)行的 SQL,這里我把日志的級別調(diào)整成 DEBUG。
運(yùn)行的項目,執(zhí)行結(jié)果比較令人驚訝,日志僅僅輸出了 INFO 日志,并沒有輸出 DEBUG 日志。
剛開始還以為 Logback 配置文件寫的有問題,才導(dǎo)致這個問題。網(wǎng)上找了幾個例子,對比了一下,這類的配置文件并沒有什么問題。
于是進(jìn)行一系列深度排查(令人頭禿),最終終于找到了問題的原因。
問題原因
由于 Logback 的配置 debug=true,項目啟動的時候,將會打印出 Logback 內(nèi)部日志信息,日志如下:

從這個日志可以看到,Logback Root 已經(jīng)設(shè)置為 DEBUG。
那為什么項目啟動之后,DEBUG 就失效了?
不要急,接著往下看。
當(dāng) Spring 容器啟動之后,Spring 內(nèi)部將會發(fā)出一些列的 ApplicationEvent,然后這些將會被各類已經(jīng)注冊的 ApplicationListener監(jiān)聽。
由于這個項目是一個 SpringBoot 的工程,里面有一個 LoggingApplicationListener將會監(jiān)聽 ApplicationEnvironmentPreparedEvent,代碼如下:

這里面的邏輯比較簡單,獲取系統(tǒng)配置的日志級別,levels 值如下:

可以看到這里 root 對應(yīng)的值為 info,這里將會繼續(xù)調(diào)用 Logback 的的方法設(shè)置日志級別,日志輸出如下:

上面這些日志級別配置來自其實來自 SpringBoot 的配置文件 application.properties

總結(jié)
最后,總結(jié)一下,SpringBoot 項目,如果使用單獨的 LogBack 配置文件,SpringBoot 的配置文件 application.properties 配置的 logging.level.root 將會覆蓋的 Logback 配置文件中的 root 的配置:
<root level="debug">
<appender-ref ref="stdout"/>
</root>
問題看起來是那么簡單,排查的過程真的是令人頭禿。


往 期 推 薦 1、Intellij IDEA這樣 配置注釋模板,讓你瞬間高出一個逼格! 2、吊炸天的 Docker 圖形化工具 Portainer,必須推薦給你! 3、最牛逼的 Java 日志框架,性能無敵,橫掃所有對手! 4、把Redis當(dāng)作隊列來用,真的合適嗎? 5、驚呆了,Spring Boot居然這么耗內(nèi)存!你知道嗎? 6、全網(wǎng)最全 Java 日志框架適配方案!還有誰不會? 7、Spring中毒太深,離開Spring我居然連最基本的接口都不會寫了

點分享

點收藏

點點贊

點在看
