<强>一、前言强>
做新应用就是这样,会遇到各种问题,昨天刚解决了加载某一个类时候抛出了类装入器的类不可见的问题,今天就有遇到了日志文件找不到的问题,还是和二方库有关的,下面就一一道来。
<强>二,问题产生强>
正常情况下在,src/main/资源目录放下,logback-spring。xml的配置文件(使用logback日志系统),如下图
保护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不生效的解决方法