目录
1、问题描述
自己写练习项目的时候,在application.yml中定义了logging.file.path:
logging:
file:
path: ./logs
也在logback-spring.xml中配置了LOG_HOME:
<springProperty scope="context" name="LOG_HOME" source="logging.file.path" />
看起来没什么问题,但是启动项目后,出现了两个日志文件夹,其中一个是预先定义的logs文件夹,另一个则是LOG_HOME_IS_UNDEFINED:
查看控制台的日志发现有一段日志信息比Spring boot的banner都更先出现:
感觉很奇怪。
2、分析过程
在网上找了半天资料,大部分说是logback启动早于spring boot,所以一开始未读取到application.yml中的LOG_HOME,转而创建了LOG_HOME_IS_UNDEFINED,在后续读到LOG_HOME后才在正确的路径输出日志。
但是俺其他的spring boot项目中并没有遇到过这种情况,所以感觉觉得这个说法不完全正确,猜测是这个项目中的某个依赖中的日志组件提前启动导致的这个问题,然后挨个排查,发现把这个依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
删除后就不会出现这个问题了。
原来是spring cloud的锅。然后又去stack overflow上查了下相关问题,发现有个老哥说了这么一段话:
During spring cloud's boostraping process, bootstrap.properties is loaded before application.properties. If we don't specify log.path in bootstrap.properties then can not find this path and logback creates an LOG_PATH_IS_UNDEFINED directory. After the bootstrap process logback is re-initialized with right configuration. Seems to be related to Spring cloud.
这老哥的大概意思是:
spring cloud项目启动时会先读取bootstrap.properties中的配置,然后再去读取application.properties中的配置。如果bootstrap.properties没有配置LOG_HOME,那logback就去自己生成LOG_HOME_IS_UNDEFINED日志目录了。
看到这里解决方法也就出来了。
3、解决办法
如果你是spring cloud项目,把logging.file.path的定义放到bootstrap.properties里去就行;
非spring cloud项目不会去读取bootstrap.properties,如果还是出现了LOG_HOME_IS_UNDEFINED,那可能只是路径配置错了,仔细检查一下吧。
其他方案
看了下别人的解决办法,有些是推荐把logback-spring.xml的重命名一下,比如改成logback-custom.xml,然后在application.properties里面去指定日志的配置文件:
logging:
config: classpath:logback-custom.xml
这样在spring cloud项目启动时无法自行找到并读取logback的配置文件,也就不会输出日志,直到读取application.properties之后才会去加载日志配置。
4、其他
又去查了下bootstrap.properties和application.properties的区别,下面是chatgpt老师的回答:
bootstrap.properties
和application.properties
是Spring Boot应用程序中两个不同的配置文件。
bootstrap.properties
文件是Spring Boot应用程序在启动时加载的第一个配置文件。这个文件通常包含一些应用程序的关键配置,比如连接到配置服务器的信息、配置日志框架等。在Spring Cloud应用程序中,bootstrap.properties
文件通常用于配置Spring Cloud Config Server,用于从远程配置服务器中获取应用程序的配置信息。在Spring Boot应用程序中,bootstrap.properties
文件的优先级高于application.properties
。
application.properties
文件是应用程序的主要配置文件,包含了所有应用程序的配置信息,例如应用程序的端口号、数据库连接等。总的来说,
bootstrap.properties
是启动应用程序所必需的配置,而application.properties
是应用程序的运行配置。
小白受教了orz