Hello,大家好,我是楼下小黑哥~
最近被公司派去北京出差,本认为是个轻松的差事,北京一环游~
然而没想到第一天就是九点半上班,粗心了~
好了,回到正题,明天来讲下最近调试我的项目的时候发现的一个 Logback 日志级别设置不失效的问题。
问题背景
事件是这样的,咱们的我的项目是一个 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>
为了不便查看我的项目执行的 SQL,这里我把日志的级别调整成 DEBUG
。
运行的我的项目,执行后果比拟令人诧异,日志仅仅输入了 INFO
日志,并没有输入 DEBUG
日志。
刚开始还认为 Logback 配置文件写的有问题,才导致这个问题。网上找了几个例子,比照了一下,这类的配置文件并没有什么问题。
于是进行一系列深度排查(令人头秃),最终终于找到了问题的起因。
问题起因
因为 Logback 的配置 debug=true
, 我的项目启动的时候,将会打印出 Logback 外部日志信息,日志如下:
从这个日志能够看到,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>
问题看起来是那么简略,排查的过程真的是令人头秃。