解决Spring Cloud加载两次logback[-spring].xml且创建两个日志文件的问题

当@SpringBootApplication的类的main函数执行SpringApplication.run()方法的时候,会执行2次run()方法(第1次是加载bootstrap.properties之后,第2次是加载application.properties之后),并且会执行2次run()方法中的如下代码:

ConfigurableEnvironment environment = prepareEnvironment(listeners,applicationArguments);

同时以上代码会执行:

LoggingApplicationListener.onApplicationEnvironmentPreparedEvent();

LoggingApplicationListener.onApplicationEnvironmentPreparedEvent();首先会查找属性中是否配置了logging.config,如果配置了则直接使用logging.config配置的文件,如果没有配置,则在classpath根路径中查找是否有logback[-spring].xml,如果找到了则加载logback[-spring].xml(如果配置了logging.path或logging.file,则LOG_FILE使用配置的参数,否则使用/tmp/spring.log),如果没有找到则加载默认规则(如果配置了logging.path或logging.file,则使用consoleAppender和fileAppender,否则只使用consoleAppender)。

在没有配置logging.config、配置了logging.path、并且有classpath:logback[-spring].xml的情况下
第1次执行LoggingApplicationListener.onApplicationEnvironmentPreparedEvent()方法的时候,那时候还没加载配置文件,logging.config取出来是null,所以加载classpath:logback[-spring].xml,由于还没加载配置文件,logging.path取出来是null,所以会使用/tmp/spring.log(没有此文件会自动创建)

第2次执行LoggingApplicationListener.onApplicationEnvironmentPreparedEvent()方法的时候,那时候已经加载了配置文件,由于没有配置logging.config,所以加载classpath:logback[-spring].xml,由于已经加载了配置文件,logging.path取出来是有值的,所以使用logging.path配置的日志文件(没有此文件会自动创建)

所以在这种情况下会创建两个日志文件,/tmp/spring.log和logging.path配置的日志文件

解决办法1:

配置logging.config为classpath:logback-conf.xml(不能为logback[-spring].xml,否则第1次执行的时候会自动查找到此文件并加载)并且配置logging.path

第1次执行LoggingApplicationListener.onApplicationEnvironmentPreparedEvent()方法的时候,那时候还没加载配置文件,logging.config取出来是null,此时查找不到classpath:logback[-spring].xml,所以加载默认规则,由于还没加载配置文件,logging.path取出来是null,所以只使用consoleAppender,输出到标准输出,不会创建日志文件

第2次执行LoggingApplicationListener.onApplicationEnvironmentPreparedEvent()方法的时候,那时候已经加载了配置文件,由于配置了logging.config,所以加载ogback-conf.xml,由于已经加载了配置文件,logging.path取出来是有值的,所以使用logging.path配置的日志文件(没有此文件会自动创建)

解决办法2:

不需要配置logging.config,直接使用classpath:logback[-spring].xml,将logging.xxx的参数配置在bootstrap.properties,那么第1次执行LoggingApplicationListener.onApplicationEnvironmentPreparedEvent()方法的时候也能获取到logging.path等参数,所以第1次和第2次执行的时候,都使用同一个日志文件

Spring Cloud使用Edgware.SR3版本,Spring Boot使用1.5.13.RELEASE版本

标签: 解决Spring Cloud加载两次logback[-spring].xml且创建两个日志文件的问题

添加新评论