背景
将dubbo的注册中心从zk切换到nacos后,在kubesphere中启动应用时发现如下报错。根据报错进行本地复现并分析出原因
jreap-demo [main]2023-04-25 09:09 [ ERROR] o.s.b.SpringApplication --- Application run failed
java.lang.IllegalStateException: Logback configuration error detected:
ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rename context [applicationName_IS_UNDEFINED] as [jreap-demo] java.lang.IllegalStateException: Context has been already given a name
at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:167)
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:289)
at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:264)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:226)
at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:203)
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:342)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:305)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
at com.example.demo.boot.JreapDemoBootApplication.main(JreapDemoBootApplication.java:49)
错误分析并解决
-
根据报错信息找到报错位置:ContextNameAction
1.1 断点ContextBase#setName方法发现其默认值为default,并且只能修改一次 -
[applicationName_IS_UNDEFINED] as [jreap-demo] 错误说明项目里有两处设置logback的contextName,查询项目确实有两处设置了spring.application.name的值(下面是我的相关配置)
-
根据上面分析可以猜测应该是有个配置没有生效,经过排查发现因为没有将bootstrap.yaml打到容器里,并且logback优先加载bootstrap.yaml。