前言
最近启动一个springboot2.2 版本项目时,发现控制台输出
这个日志如果不细看还以为是启动报错,其实这段日志是springboot2的自动装配日志报告。平时我们是不大需要,因此我们可以关闭。关闭的方法也很简单,从控制台打印的日志信息我们可以得知自动装配日志报告是由
代码语言:txt复制org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
这个类触发,而且日志级别是Debug级别。因此要关闭这段日志,只需在application.yml做如下配置
代码语言:txt复制logging:
level:
org:
springframework:
boot:
autoconfigure:
logging: info
日志级别改为debug级别以上就行了。然后启动见证一下奇迹,奇迹没出现,自动装配日志报告依然坚挺的出现
排查
以多年的编程直觉,我这么写应该是没错的,错的原因可能就是把正确的内容放到不恰当的位置,导致不起作用。带着这个主观臆断的思路,我们可以思考下,正常我们控制台打印日志信息的日志级别会配置在哪里,一个是配置文件比如application.yml,一个是配置在日志文件中(比如logback文件中),当然也可以借助其他工具进行配置(这个我们就不讨论了,因为我不会)
验证
既然我们在application.yml配置不起效果,那我们就在项目中已经配置的logback-spring.xml中加如下内容
代码语言:txt复制 <logger level="info" name="org.springframework.boot.autoconfigure.logging" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="logFile" />
</logger>
然后再启动试下,这次看下控制台
很明显这次我们成功了
Q&A
1、当项目中只有application.yml文件时,配置的日志级别是否生效?
会生效
验证
去除项目中的logback-spring.xml,然后在application.yml配置如下内容
代码语言:txt复制logging:
level:
org:
springframework:
boot:
autoconfigure:
logging: info
启动查看日志信息
代码语言:txt复制Connected to the target VM, address: '127.0.0.1:59757', transport: 'socket'
. ____ _ __ _ _
/\ / ___'_ __ _ _(_)_ __ __ _
( ( )___ | '_ | '_| | '_ / _` |
\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |___, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.2.5.RELEASE)
2020-07-14 19:08:53.345 INFO 5868 --- [ main] com.nisbos.goods.GoodsApplication : No active profile set, falling back to default profiles: default
2020-07-14 19:08:54.853 WARN 5868 --- [ main] o.s.boot.actuate.endpoint.EndpointId : Endpoint ID 'service-registry' contains invalid characters, please migrate to a valid format.
2020-07-14 19:08:54.874 WARN 5868 --- [ main] o.s.boot.actuate.endpoint.EndpointId
说明配置生效
2、当项目中同时存在logback-spring.xml和application.yml,同种类包日志级别配置以哪个为准?
以logback-spring.xml配置的日志级别为准
验证一
logback-spring.xml配置日志级别为debug
代码语言:txt复制 <logger level="debug" name="org.springframework.boot.autoconfigure.logging" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="logFile" />
</logger>
application.yml配置日志级别为info
代码语言:txt复制logging:
org:
springframework:
boot:
autoconfigure:
logging: info
启动查看控制台
验证二
logback-spring.xml配置日志级别为info
代码语言:txt复制 <logger level="info" name="org.springframework.boot.autoconfigure.logging" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="logFile" />
</logger>
application.yml配置日志级别为debug
代码语言:txt复制logging:
org:
springframework:
boot:
autoconfigure:
logging: debug
启动查看控制台
3、当项目中同时存在logback.xml和application.yml,同种类包日志级别配置以哪个为准?
以logback.xml配置的日志级别为准
这个就不贴验证过程了
结论
当项目中同时在application.yml和logback.xml、logback-spring.xml配置同种类包日志级别时,以logback-spring.xml、logback.xml配置的日志级别为准
延展
细心的朋友可能会发现我分别用logback-spring.xml、logback.xml来验证。那logback-spring.xml和logback.xml这两种文件到底有什么区别?
上面的图片来源于springboot官网,从图片我们可以得到几点信息,springboot官方推荐使用logback-spring.xml。理由是如果是用logback.xml,在标准的日志存放的地方(比如src/main/resource),spring将无法完全控制日志的初始化。其次如果使用logback.xml,则没法使用springboot提供的一些扩展功能。比如你在logback.xml使用springProperty或者springProfile标签时,将无法得到预期的效果
总结
其实我第一次在配置
代码语言:txt复制logging.level.org.springframework.boot.autoconfigure: info
没法去除启动时输出自动装配日志报告后,也曾利用搜索引擎寻找答案。然后得到的答案如下:
而且不止一篇都是说这么配置。但我依然很固执没按搜索引擎那样的说,把日志级别调成ERROR。原因是我们控制台保留完整的案发现场,他输出日志级别是debug,因此日志级别调整成debug级别以上就行。