SpringBoot配置logback/log4j2保存路径等变量的方式

3,772 阅读2分钟

缘起

由于SpringBoot项目支持多环境配置,但是logback-spring.xml或log4j2-spring.xml一般只写一份,所以需要根据不同的环境配置不同的日志保存路径。之前在搜索资料,并尝试多种方式后都未能很好地解决动态读取日志保存路径问题(曾经通过代码进行获取环境变量的方式解决过,但还是太麻烦),而最近已解决,所以记录下来并分享给大家。

尝试的办法

在网上能找到的解决办法一般是:在application.yml(或application.properties)中配置日志的保存路径

log:
  path: 'D:/app/logs'

然后在日志框架的配置文件中读取,写法如下:

logback

<springProperty scope="context" name="LOG_NAME" source="spring.application.name"/>
<!-- 日志存放路径 -->
<springProperty scope="context" name="LOG_PATH" source="log.path"/>

log4j2

<!-- 变量配置 -->
<Properties>
    <!-- 定义日志存储的路径,不要配置相对路径 -->
    <property name="FILE_PATH" value="${log.path}"/>
</Properties>

多次启动springboot项目均无法获取到变量(有看到网上部分人说需要在启动后过一会才能生效)。

解决方案

编写代码(不推荐)

参考文章:

《springboot读取yml中的配置加载到javabean中》

《springboot log4j2.xml读取application.yml中的属性值》

此种方式亲测可以达到目的,但需要编写代码,不推荐使用。

在bootstrap-*.yml中配置变量

最近在搭建框架时,使用SpringCloudAlibaba的Nacos作为配置中心,而其配置Nacos服务器时,必须在bootstrap.yml中配置,所以想起了bootstrap.yml是优先于application.yml的,于是便在bootstrap.yml中尝试配置日志的保存路径,发现果然有效。

image.png

原因分析

可能的原因是:日志配置文件先于application.yml被加载,所以无法读取到application.yml中配置。(以后若找到源码证据,将会继续更新)

bootstrap.yml(bootstrap.properties)与application.yml(application.properties)执行顺序

bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等

application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

bootstrap.yml 先于 application.yml 加载


如果大家也遇到了这个问题,欢迎一起交流哦(#^.^#)