Spring Boot集成logback出现log.dir_IS_UNDEFINED问题

Spring Boot集成logback出现log.dir_IS_UNDEFINED问题——未完全解决

缘起

公司新创建了一个项目,搭建基础框架,本地启动时总会在项目根路径出现一个log.dir_IS_UNDEFINEDlog.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.xmllogback-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这个标签,现在着急启动项目,先挖个坑,后面找下原因。
-----------20240720分割线我来填坑了-----------
以上的完美解决方案为:

  1. 日志的配置文件名改为logback-custom.xml
  2. 在项目resources下添加一个配置文件application.properties,内容如下:
logging.config=classpath:logback-custom.xml
log.dir=/opt/data/logs
  1. logback-custom.xml内容为:
<!-- 部分配置 -->
<configuration debug="false" scan="false">
	<!-- 读取spring boot配置 -->
    <springProperty scope="context" name="log.dir" source="log.dir" default="/opt/app/logs"/>
    <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>

个人理解应该是application.properties文件加载优先级最高,在Spring Boot启动前会被读取到,所以初始化logback组件时能读取到数据。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_info] - openFile(/home/ruoyi/logs/sys-info.log,true) call failed. java.io.FileNotFoundException: /home/ruoyi/logs/sys-info.log (No such file or directory) ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error] - Failed to create parent directories for [/home/ruoyi/logs/sys-error.log] ERROR in ch.qos.logback.core.rolling.RollingFileAppender[file_error] - openFile(/home/ruoyi/logs/sys-error.log,true) call failed. java.io.FileNotFoundException: /home/ruoyi/logs/sys-error.log (No such file or directory) ERROR in ch.qos.logback.core.rolling.RollingFileAppender[sys-user] - Failed to create parent directories for [/home/ruoyi/logs/sys-user.log] ERROR in ch.qos.logback.core.rolling.RollingFileAppender[sys-user] - openFile(/home/ruoyi/logs/sys-user.log,true) call failed. java.io.FileNotFoundException: /home/ruoyi/logs/sys-user.log (No such file or directory) at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:179) at org.springframework.boot.logging.logback.LogbackLoggingSystem.reinitialize(LogbackLoggingSystem.java:232) at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:73) at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60) at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:132) at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313) ... 26 more
06-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值