SpringBoot之logback-spring.xml不生效的解决方法

  

<强>一、前言

  

做新应用就是这样,会遇到各种问题,昨天刚解决了加载某一个类时候抛出了类装入器的类不可见的问题,今天就有遇到了日志文件找不到的问题,还是和二方库有关的,下面就一一道来。

  

<强>二,问题产生

  

正常情况下在,src/main/资源目录放下,logback-spring。xml的配置文件(使用logback日志系统),如下图

  

 SpringBoot之logback-spring.xml不生效的解决方法”>,</p>
  <p> application.properties里面设置,spring.application.name=spring-boot-demo-application <br/>
  </p>
  <p>引入了一个二方包,二方包里面有logback。xml <br/>
  </p>
  <p>按照上面配置,运行后正常情况下我们希望在用户。家庭/spring-boot-demo-application/日志目录应该有应用。日志日志文件,然而并没有,连spring-boot-demo-application这个文件夹都没有生成。</p>
  <h3>三,问题分析</h3>
  <p>那么我们就去看看日志系统是如何查找并解析日志配置文件的,SpringBoot中是使用LoggingApplicationListener这个类来进行日志系统的初始化的.LoggingApplicationListener实现了ApplicationListener接口,那么我们通过时序图看LoggingApplicationListener的onApplicationEvent方法做了啥:</p>
  <p> <img src=   保护String [] getStandardConfigLocations () {   返回新String [] {”logback-test。groovy”、“logback-test。xml”、“logback.groovy”,   “logback。xml "};   }      

logback-test像”。groovy”、“logback-test。xml”、“logback.groovy”、“logback。xml”这些是标准的。

  

那么具体怎么查找那,要看代码(10):

        私人findConfig字符串(String[]位置){   (字符串位置:位置){   ClassPathResource资源=new ClassPathResource(位置,   this.classLoader);   如果(resource.exists ()) {   返回“类路径:“+位置;   }   }   返回null;   }   之前      

可知使用ClassPathResource类去查,找下面看ClassPathResource存在的方法:

        公众存在布尔(){   返回(resolveURL () !=null);   }         保护URL resolveURL () {   如果这一点。clazz !=null) {   返回this.clazz.getResource (this.path);   }   else if(这一点。类加载器!=null) {   返回this.classLoader.getResource (this.path);   }   其他{   返回ClassLoader.getSystemResource (this.path);   }   }      之前      

可知是使用this.classLoader.getResource (this.path);去查找这里类加载器为AppClassloader。

  

如果代码(8)没有查找到配置,则执行点(12),代码12逻辑和代码(8)类似只是查找文件名字不一样,下面看下:
  

        保护String [] getSpringConfigLocations () {   String []=getStandardConfigLocations位置();   for (int i=0;我& lt;locations.length;我+ +){   字符串扩展=StringUtils.getFilenameExtension(位置[我]);   位置[我]=[我].substring位置(0,   位置[我]. length ()——extension.length() - 1) +“春天”。   +扩展;   }   返回的位置;   }   之前      

可知是在getStandardConfigLocations的文件名上拼接春天,拼接后的文件名为:

  

"”logback-test-spring。groovy”、“logback-test-spring。xml”、“logback-spring.groovy”、“logback-spring。xml "

  

综上所述SpringBoot首先去查找标准的日志配置文件,如果找不到在去找拼接春天的配置的文件。

  

那么上面我们说了应用中是引入了一个含有logback.xml的jar包,而这个jar包也是使用appclassloader加载的,所以在执行步骤(8)的时候找到了jar包里面的logback.xml,所以就不会再去执行步骤(12)来找我们自定义的logback-spring.xml了。

  

四,问题解决

  

方案一、修改我们的配置文件为logback.xml,这样在步骤(8)的时候会首先查找logback。xml,应该是可以找到的。
  

  

方案二,避免二方包里面含有logback.xml,这种情况下,无论我们自己的配置是logback-spring.xml还是logback。xml都不会有问题。
  

  

五、总结

  

SpringBoot之logback-spring.xml不生效的解决方法