专栏首页Java编程技术SpringBoot之日志文件找不到

SpringBoot之日志文件找不到

一、前言

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

二、问题产生

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

image.png

  • application.properties里面设置 spring.application.name=spring-boot-demo-application
  • 引入了一个二方包,二方包里面有logback.xml

按照上面配置,运行后正常情况下我们希望在 user.home/spring-boot-demo-application/logs目录应该有applicaiton.log日志文件,然而并没有,连spring-boot-demo-application这个文件夹都没有生成。

三、问题分析

那么我们就去看看日志系统是如何查找并解析日志配置文件的,SpringBoot中是使用LoggingApplicationListener这个类来进行日志系统的初始化的。LoggingApplicationListener实现了ApplicationListener接口,那么我们通过时序图看LoggingApplicationListener的onApplicationEvent方法做了啥:

image.png

  • 代码(8)查找标准日志配置文件,什么是标准那,那么就看代码(9)的代码:
   protected String[] getStandardConfigLocations() {
       return new String[] { "logback-test.groovy", "logback-test.xml", "logback.groovy",
               "logback.xml" };
   }

"logback-test.groovy", "logback-test.xml", "logback.groovy","logback.xml"这些是标准的。 那么具体怎么查找那,要看代码(10):

   private String findConfig(String[] locations) {
       for (String location : locations) {
           ClassPathResource resource = new ClassPathResource(location,
                   this.classLoader);
           if (resource.exists()) {
               return "classpath:" + location;
           }
       }
       return null;
   }

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

   public boolean exists() {
       return (resolveURL() != null);
   }

   
   protected URL resolveURL() {
       if (this.clazz != null) {
           return this.clazz.getResource(this.path);
       }
       else if (this.classLoader != null) {
           return this.classLoader.getResource(this.path);
       }
       else {
           return ClassLoader.getSystemResource(this.path);
       }
   }

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

  • 如果代码(8)没有查找到配置,则执行点(12),代码12逻辑和代码(8)类似只是查找文件名字不一样,下面看下:
   protected String[] getSpringConfigLocations() {
       String[] locations = getStandardConfigLocations();
       for (int i = 0; i < locations.length; i++) {
           String extension = StringUtils.getFilenameExtension(locations[i]);
           locations[i] = locations[i].substring(0,
                   locations[i].length() - extension.length() - 1) + "-spring."
                   + extension;
       }
       return locations;
   }

可知是在getStandardConfigLocations的文件名上拼接spring,拼接后的文件名为: ``` "logback-test-spring.groovy", "logback-test-spring.xml", "logback-spring.groovy","logback-spring.xml" ``

综上所述SpringBoot首先去查找标准的日志配置文件,如果找不到在去找拼接Spring的配置的文件。 那么上面我们说了应用中是引入了一个含有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,自己定义一个ClassLoader,自定义getResource方法。

五、总结

日常开发中二方包里面不要带有日志配置文件,二方库中使用日志一般都是使用代码创建的方式。 欢迎关注微信公众号 '技术原始积累'

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈分布式领域CAP理论

    CAP是分布式系统的重要理论,在大型分布式系统中一致性(Consistency),高可用性(High-Availability),分区可容忍性(Partitio...

    加多
  • Java中使用Math.abs你入坑了?

    Math.abs函数是jdk中提供的一个用来返回入参绝对值的函数,也就是你输入一个负数,它会返回其对应绝对值正数,这个在大部分情况下是这样,但是特殊情况下,还是...

    加多
  • Springboot模块分类

    springboot可以依据classpath里面的依赖的内容来自动配置bean到IOC容器,但是要开启这个自动配置功能需要添加@EnableAutoConfi...

    加多
  • python网络编程-异常处理-异常捕获-抛出异常-断言-自定义异常-UDP通信-socketserver模块应用-03

    异常:程序在运行过程中出现了不可预知的错误,并且该错误没有对应的处理机制,那么就会以异常的形式表现出来

    suwanbin
  • 从零开始的Spring Security Oauth2(一)

    前言 今天来聊聊一个接口对接的场景,A厂家有一套HTTP接口需要提供给B厂家使用,由于是外网环境,所以需要有一套安全机制保障,这个时候oauth2就可以作为一个...

    程序猿DD
  • ThinkPHP5.1 安装 workerman 指导

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    泥豆芽儿 MT
  • 人工智能开发者必须知道的十种深度学习方法!

    源| AI 科技评论文| Camel 不管是AI也好,其他学科也好,学习、研究的过程中不断反思学科的历史,总结学科的发展现状,找出最重要的理念,总能让人能“吾道...

    企鹅号小编
  • 【下载】面向搜索的深度学习实战书籍和代码《Deep Learning for Search》

    【导读】 信息检索资深专家Tommaso Teofili最新撰写的面向搜索的深度学习实战书籍(预计2018年夏季出版)《Deep Learning for Se...

    WZEARW
  • 手札《nginx – A Practical Guide to High Performance》

    今晚无意发现Nginx官方出了一本Guide to Hight Performance的书,翻了一下,有一些蛮有意思的点。

    libo1106
  • SpringBoot学习:整合shiro(身份认证和权限认证),使用EhCache缓存

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)在pom.xml中添加依赖: <prope...

    庞小明

扫码关注云+社区

领取腾讯云代金券