一個(gè)令人頭禿的問(wèn)題,Logback 日志級(jí)別設(shè)置竟然無(wú)效?
點(diǎn)擊藍(lán)色「小黑十一點(diǎn)半」關(guān)注樓下小黑哥??
Hello,大家好,我是樓下小黑哥~
最近被公司派去北京出差,本以為是個(gè)輕松的差事,北京一周游~
但是沒(méi)想到第一天就是九點(diǎn)半下班, 大意了~

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

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

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

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

上面這些日志級(jí)別配置來(lái)自其實(shí)來(lái)自 SpringBoot 的配置文件 application.properties

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

這樣設(shè)置,讓你的 IDEA 好看到爆炸
