记Spring boot 2.x logback在配置与应用分离的情况下读取application.yml环境变量出现的问题及解决

本文介绍SpringBoot中自定义日志配置的方法,包括通过系统属性及application.yml文件灵活设置日志参数,解决配置与应用分离时的环境变量读取问题。

Spring boot支持已自定义的方式设置日志。详见官网自定义设置日志小节

由于spring对日志对象的初始化先于application context创建之前,所以我们不能以 @PropertySources 或 @Configuration的方式去实例化日志对象,对日志进行设置。只能通过定义的系统属性。根据Spring官网,其指定了特定命名规范的xml配置文件,用于进行自定义的日志文件配置。
在这里插入图片描述用户可以将不同日志系统的上述对应xml文件放置到maven项目的resource中,进行自定义设置。

我们可以在spring application.yml文件中设置一些变量,供日志系统的xml文件使用,从而为日志的参数设置提升更高灵活性。使用标签为日志系统的xml文件引入application.yml中的属性设置。
例如spring官网给出的格式:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
		defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
	<remoteHost>${fluentHost}</remoteHost>
	...
</appender>

springProperty 的source属性为application.yml中的属性名称,必须以“.”分隔,仿照application.properties的方式。defaultValue是相关属性缺省时的默认参数。以${}的方式在日志配置中使用。

logback在配置与应用分离的条件下读取application.yml环境变量出现的问题

spring对配置文件applicaiton.yml的加载在不同路径是有先后顺序的。可以根据这一特点进行一种配置与应用分离的设计。优点是易于运维维护。
在这里插入图片描述
当进行配置分离时,ide工具调试可以正常按照spring对application配置文件的加载顺序正确加载配置项。但是在打包后独立运行发现无法读取项目外部application中配置项,相关属性以项目内的application配置项为准。

2019-08-20问题终于解决了。原来外部配置文件的相关属性项在yml文件中的层级关系写错了,导致程序直接忽略外部yml中的相关项只读取jar包内部的yml相关项。 翻车。。。

所以在符合大部分常识和认知的的基础上出现的问题,还是要仔细回过头来排查基础的配置项是否有写错,基本的路径和参数是否有写错。

Spring Boot 里,能把 `logback-spring.xml` 里的日志文件生成路径配置到 `application.yml` 中读取。下面是具体的操作方法: ### 1. 在 `application.yml` 里配置日志文件路径 在 `application.yml` 文件中添加日志文件路径的配置,示例如下: ```yaml logging: file: path: /var/log/myapp/ ``` ### 2. 在 `logback-spring.xml` 里引用 `application.yml` 中的配置 在 `logback-spring.xml` 文件中,借助 Spring Boot 的属性占位符 `${}` 来引用 `application.yml` 里的配置,示例如下: ```xml <configuration> <!-- 引用 application.yml 中的日志文件路径 --> <property name="LOG_FILE_PATH" value="${logging.file.path}"/> <!-- 定义一个文件输出的 appender --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 设置日志文件的路径和名称 --> <file>${LOG_FILE_PATH}/myapp.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 滚动日志文件的命名规则 --> <fileNamePattern>${LOG_FILE_PATH}/myapp.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 保留的历史日志文件的最大数量 --> <maxHistory>30</maxHistory> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 根日志配置 --> <root level="INFO"> <appender-ref ref="FILE"/> </root> </configuration> ``` ### 解释 - 在 `application.yml` 中,`logging.file.path` 定义了日志文件的生成路径。 - 在 `logback-spring.xml` 中,通过 `${logging.file.path}` 引用 `application.yml` 里的配置。 - 借助 `<property>` 标签把引用的值赋给 `LOG_FILE_PATH` 变量,之后在 `<file>` 和 `<fileNamePattern>` 标签里使用该变量。 ### 注意事项 - 要保证 `logback-spring.xml` 文件的命名是 `logback-spring.xml`,而非 `logback.xml`,因为 Spring Boot 会优先加载 `logback-spring.xml`,这样才能使用 Spring Boot 的属性占位符。 - 要确保应用程序对配置的日志文件路径有写入权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值