Spring Boot集成logback出现log.dir_IS_UNDEFINED问题——未完全解决
缘起
公司新创建了一个项目,搭建基础框架,本地启动时总会在项目根路径出现一个log.dir_IS_UNDEFINED
,log.dir
是我配置的logback
日志的根目录,配置在bootsrap-xxx.yml
中
Spring Boot 3.x
Spring Boot Web Starter 3.2.5(引入了logback1.4.14)
logback-spring.xml
相关配置如下:
<configuration debug="false" scan="false">
<!-- 读取spring boot配置 -->
<springProperty scope="context" name="log.dir" source="log.dir" />
<property name="projectName" value="xxx-user" />
<appender name="infoAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.dir}/${projectName}_info.log</file>
<!-- ... 省略其它分割日志规则配置 -->
</appender>
<!-- ... 省略其它appender -->
<root>
<level value="INFO" />
<appender-ref ref="infoAppender"/>
</root>
</configuration>
bootstrap.yml
配置如下:
log:
dir: /data/xxx/xxx-user/logs
jasypt惹的祸
因为依赖不多,发现去掉
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
</dependency>
不会出现这个问题,查了下jasypt
有自己的加载顺序,虽然知道可能是jasypt
的问题,但这个组件不能去掉,只能想别的办法。
Spring Boot中logback加载顺序
chatgpt上查到:
在Spring Boot中,Logback的加载顺序如下:
logback-spring.xml 或 logback.xml:这是默认的配置文件,位于项目的src/main/resources目录下。如果存在,它将被首先加载。
logback-spring.groovy 或 logback.groovy:如果项目中有这些文件,它们将在logback-spring.xml或logback.xml之后加载。
logback-spring.json 或 logback.json:如果项目中有这些文件,它们将在上述XML和Groovy配置文件之后加载。
系统属性:如果在启动时设置了-Dlogback.configurationFile属性,那么指定的配置文件将被加载。例如,-Dlogback.configurationFile=my-logback.xml将加载名为my-logback.xml的文件。
类路径下的logback-test.xml:如果在测试环境中运行应用程序,并且希望使用不同的日志配置,可以在类路径下添加一个名为logback-test.xml的文件。这将覆盖其他配置文件中的设置。
需要注意的是,如果有多个相同类型的配置文件(如logback-spring.xml),只有第一个找到的配置文件会被加载。
因为要读取bootstrap.yml
的配置,我用的是logback-spring.xml
这个名字,讲道理只会加载一次,但我在启动日志中找到了两处加载日志,一次是在启动最开始,另一次紧挨着jasypt
,部分日志如下:
第一次看到的
10:38:08,823 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[infoAppender] - Active log file name: /data/xxx/xxx-user/logs/xxx-user_info.log
10:38:08,823 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[infoAppender] - File property is set to [/data/xxx/xxx-user/logs/xxx-user_info.log]
第二次看到的
[2024-07-04 10:38:09,301] [main] [INFO ] [com.ulisesbocchio.jasyptspringboot.EncryptablePropertySourceConverter:110] [] [] [] - Converting PropertySource applicationConfig: [classpath:/bootstrap.yml] [org.springframework.boot.env.OriginTrackedMapPropertySource] to EncryptableMapPropertySourceWrapper
10:38:09,497 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[infoAppender] - Active log file name: log.dir_IS_UNDEFINED/xxx-user_info.log
10:38:09,497 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[infoAppender] - File property is set to [log.dir_IS_UNDEFINED/xxx-user_info.log]
根据上面的日志,发现第一次是我正确配置的,说明还是读取到了动态配置,第二次就比较耐人寻味了,能力比较菜,在jasypt
找了好久的原因也没找到。只能想别的办法了。
尝试指定配置文件
bootstrap.yml
尝试指定配置文件,添加
logging:
config: classpath:logback-spring.xml
重新启动发现问题还在,忽然意识到logback-spring.xml
这个名字有点特殊,换个名字试试:
logging:
config: classpath:logback-custom.xml
发现居然没问题了。
解决方案总结
bootstrap.yml
配置如下:
logging:
config: classpath:logback-custom.xml
log:
dir: /data/xxx/xxx-user/logs
logback-custom.xml
(不要使用logback.xml
和logback-spring.xml
)
<!-- 部分配置 -->
<configuration debug="false" scan="false">
<!-- 读取spring boot配置 -->
<springProperty scope="context" name="log.dir" source="log.dir" />
<property name="projectName" value="xxx-user" />
<appender name="infoAppender"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.dir}/${projectName}_info.log</file>
<!-- ... 省略其它分割日志规则配置 -->
</appender>
<!-- ... 省略其它appender -->
<root>
<level value="INFO" />
<appender-ref ref="infoAppender"/>
</root>
</configuration>
-----------20240705分割线-----------
用了几天发现,日志无法输出到文件,根本就不显示打出的日志,不知道为啥,后续我又改回了logback.xml
这个名字,去掉了springProperty
这个标签,现在着急启动项目,先挖个坑,后面找下原因。