引入nacos,logback springProperty标签引用内容无法解析问题解决,配置加载顺序导致

文章描述了一个SpringBoot应用在启动时因logback-spring.xml配置文件加载顺序导致无法读取application.yml中定义的配置变量,从而引发日志配置错误。解决方案包括更改logback配置文件名称或将变量移至bootstrap.yml中,确保正确加载顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于我定义的两个配置变量来动态获取application.yml中的配置项,但由报错

Log_MAXfILESIZE_IS_UNDEFINED Log_TOTALSIZECAP_IS_UNDEFINED

可以看出是spring容器没有检测到此定义引用,原因是logback日志配置文件,在名字为logback-spring.xml是加载顺序在application.yml前,所以未获取到application.yml中声明的变量值。

application.yml
logHome: ./logs
logMaxFileSize: XXXMB
logTotalSizeCap: XXGB
logMaxHistory: XX
logLevel: XXX
报错信息如下:
Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.joran.util.PropertySetter@2accdbb5 - Failed to invoke valueOf{} method in class [ch.qos.logback.core.util.FileSize] with value [Log_MAXfILESIZE_IS_UNDEFINED]
ERROR in ch.qos.logback.core.joran.util.PropertySetter@b62d79 - Failed to invoke valueOf{} method in class [ch.qos.logback.core.util.FileSize] with value [Log_TOTALSIZECAP_IS_UNDEFINED]
ERROR in c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@1714550218 - maxFileSize property is mandatory.
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:169)
	at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:80)
	at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:118)
	at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:313)
	at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:288)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:246)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:223)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
	at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:140)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:212)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:117)
	at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:74)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:76)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:53)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:345)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
	at com.dingxianginc.darklightconsole.Application.main(Application.java:22)

Process finished with exit code 1

解决方案

SpringPropertyAction
全局搜索 springProperty , 发现 org.springframework.boot.logging.logback.SpringPropertyAction 类是负责解析相关值的。
这个类通过 Spring的 Environment 获取yml配置中的值。看到实际上是加载了 bootstrap.yml 。
本质上是logback比application.yml 更早的去加载
在这里插入图片描述在这里插入图片描述

1.将logback-spring.xml改未非此文件名如:logback-delay.xml,spring就会优先加载application.yml配置文件
并指定文件类路径

logging:
  config: classpath:logback-delayed.xml

2.将自定义配置信息放入bootstrap.yml中,bootstrap.yml的加载顺序为最先,因为要从nacos服务器获取配置
3…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值