由于我定义的两个配置变量来动态获取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…