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这个标签,现在着急启动项目,先挖个坑,后面找下原因。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 21:20:04       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 21:20:04       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 21:20:04       4 阅读
  4. Python语言-面向对象

    2024-07-10 21:20:04       7 阅读

热门阅读

  1. python的抽象基类

    2024-07-10 21:20:04       10 阅读
  2. 软设之桥接模式

    2024-07-10 21:20:04       12 阅读
  3. 洛谷 B4006 [GESP202406 四级] 宝箱

    2024-07-10 21:20:04       11 阅读
  4. Qt常用基础控件总结—菜单控件(QMenu类)

    2024-07-10 21:20:04       12 阅读
  5. 缓存击穿、缓存穿透、缓存雪崩以及应对措施

    2024-07-10 21:20:04       9 阅读
  6. Python基础学习笔记——异常

    2024-07-10 21:20:04       10 阅读
  7. C语言 printf函数缓冲机制

    2024-07-10 21:20:04       12 阅读