springboot中日志配置xml文件是如何加载的?

loserwang
  • 16

在Spring项目中,如果使用logback日志,首先在classpath:文件下配置logback.xml文件。按照我的理解 Logback日志会自动搜索并加载logback.xml , 可是在springboot中如果配置文件名为logback-spring.xml也能生效,SpringBoot是对Lockback进行什么操作了么?

回复
阅读 635
1 个回答
✓ 已被采纳

如果仅仅是想看SpringBootLogback到底做了啥,但是又不知道从哪里看起走(也就是找不到源码地方),那这里推荐一个方法:将错就错法(自己瞎编的名字,哈哈哈)

因为我们配置一个正常的SpringBoot+logback-spring.xml是非常简单,而且肯定可以正常跑起来,所以此时,我们只需要把logback-spring.xml配置错,搞坏掉,那么SpringBoot处理的时候肯定会出错咯,这样咱们有了堆栈,不就可以慢慢顺藤摸瓜了嘛

说干就干,找一个logback-spring.xml配置文件,随便在它里面加一个1,总之破坏掉xml文件格式即可
image.png

直接跑起来,果然报了一串错,从画白线开始,包名带了logging,说明啊入口就在这里了LoggingApplicationListener
image.png

其实顺着这些代码大体一看,还是Spring常干的那些事嘛,就是业务的再抽象,这样它粘合剂的效果才得以真正展现啊,所以日志系统,它就抽象出了一个LoggingSystem,这是一个抽象类,Logback的实现就是LogbackLoggingSystemLog4j2的实现叫Log4J2LoggingSystem等,整个初始化过程,其实就是LogbackLoggingSystem的初始化,而LogbackLoggingSystem再把Logback包一下,所以也会初始化Logbackch.qos.logback.classic.LoggerContext

因此看下来,如果要去找为啥logback-spring.xmlSpringBoot为啥会生效,那我们只用去看LogbackLoggingSystem如何初始化的即可,结合最开始我们将错就错的报错堆栈里报错点,因为我们是把xml里弄错而得到的堆栈,最后报错的地方是LogbackLoggingSystem.loadConfiguration,而此时肯定是已经找到了logback-spring.xml文件并加载了,所以我们起码也要回到这个方法的上一层开始找,也就是AbstractLoggingSystem.initializeWithConventions

断点一打,一眼就清楚了,这里的config有两处赋值
image.png

而源码进去一看,无论是getSelfInitializationConfig()还是getSpringInitializationConfig(),他们的来源都是LogbackLoggingSystem.getStandardConfigLocations

image.png

唯一区别就是

  • 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"
    image.png

差不多就是这样的吧,以上的思路仅供参考

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏