springboot中日志配置xml文件是如何加载的?
在Spring项目中,如果使用logback
日志,首先在classpath:
文件下配置logback.xml
文件。按照我的理解 Logback日志会自动搜索并加载logback.xml
, 可是在springboot
中如果配置文件名为logback-spring.xml
也能生效,SpringBoot
是对Lockback进行什么操作了么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果仅仅是想看
SpringBoot
对Logback
到底做了啥,但是又不知道从哪里看起走(也就是找不到源码地方),那这里推荐一个方法:将错就错法(自己瞎编的名字,哈哈哈)因为我们配置一个正常的
SpringBoot
+logback-spring.xml
是非常简单,而且肯定可以正常跑起来,所以此时,我们只需要把logback-spring.xml
配置错,搞坏掉,那么SpringBoot
处理的时候肯定会出错咯,这样咱们有了堆栈,不就可以慢慢顺藤摸瓜了嘛说干就干,找一个
logback-spring.xml
配置文件,随便在它里面加一个1
,总之破坏掉xml
文件格式即可直接跑起来,果然报了一串错,从画白线开始,包名带了
logging
,说明啊入口就在这里了LoggingApplicationListener
其实顺着这些代码大体一看,还是
Spring
常干的那些事嘛,就是业务的再抽象,这样它粘合剂的效果才得以真正展现啊,所以日志系统,它就抽象出了一个LoggingSystem
,这是一个抽象类,Logback
的实现就是LogbackLoggingSystem
,Log4j2
的实现叫Log4J2LoggingSystem
等,整个初始化过程,其实就是LogbackLoggingSystem
的初始化,而LogbackLoggingSystem
再把Logback
包一下,所以也会初始化Logback
的ch.qos.logback.classic.LoggerContext
因此看下来,如果要去找为啥
logback-spring.xml
在SpringBoot
为啥会生效,那我们只用去看LogbackLoggingSystem
如何初始化的即可,结合最开始我们将错就错的报错堆栈里报错点,因为我们是把xml
里弄错而得到的堆栈,最后报错的地方是LogbackLoggingSystem.loadConfiguration
,而此时肯定是已经找到了logback-spring.xml
文件并加载了,所以我们起码也要回到这个方法的上一层开始找,也就是AbstractLoggingSystem.initializeWithConventions
断点一打,一眼就清楚了,这里的
config
有两处赋值而源码进去一看,无论是
getSelfInitializationConfig()
还是getSpringInitializationConfig()
,他们的来源都是LogbackLoggingSystem.getStandardConfigLocations
唯一区别就是
getSelfInitializationConfig()
直接使用LogbackLoggingSystem.getStandardConfigLocations
的值,就是找"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml"
这些文件getSpringInitializationConfig()
是要在LogbackLoggingSystem.getStandardConfigLocations
的值的基础上,加一个-spring
文件名后缀,也就是"logback-test-spring.groovy", "logback-test-spring.xml", "logback-spring.groovy", "logback-spring.xml"
差不多就是这样的吧,以上的思路仅供参考