Caused by: java.lang.IllegalStateException: java.lang.IllegalStateException: Logback configuration error detected: ERROR in ch.qos.logback.classic.joran.action.ContextNameAction - Failed to rename context [nacos] as [logback] java.lang.IllegalStateException: Context has been already given a name at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:321) at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:281) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:239) at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:216) 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:80) 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.stream.binder.DefaultBinderFactory.getBinderInstance(DefaultBinderFactory.java:320) at org.springframework.cloud.stream.binder.DefaultBinderFactory.doGetBinder(DefaultBinderFactory.java:209) at org.springframework.cloud.stream.binder.DefaultBinderFactory.getBinder(DefaultBinderFactory.java:140) at org.springframework.cloud.stream.binding.BindingService.getBinder(BindingService.java:379) at org.springframework.cloud.stream.binding.BindingService.bindProducer(BindingService.java:268) at org.springframework.cloud.stream.binding.BindingService.bindProducer(BindingService.java:291) at org.springframework.cloud.stream.binding.AbstractBindableProxyFactory.createAndBindOutputs(AbstractBindableProxyFactory.java:136) at org.springframework.cloud.stream.binding.OutputBindingLifecycle.doStartWithBindable(OutputBindingLifecycle.java:58) at java.util.LinkedHashMap$LinkedValues.forEach(LinkedHashMap.java:608) at org.springframework.cloud.stream.binding.AbstractBindingLifecycle.start(AbstractBindingLifecycle.java:57) at org.springframework.cloud.stream.binding.OutputBindingLifecycle.start(OutputBindingLifecycle.java:34) at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182)
-Dnacos.logging.default.config.enabled=false
錯誤原因
錯誤原因在於nacos引入的nacsos-client.jar內含有默認的nacos-logback.xml/nacos-log4j2.xml,其中nacos-logback.xml中contextName屬性為nacos
該屬性與自定義的logback.xml不一致導致沖突
https://github.com/alibaba/nacos/issues/1959
因為Spring Boot本身已經集成了日志框架Logback,而在Alibaba Nacos中又集成了一套Logback框架
而Alibaba Nacos中的Logback加載要優先於項目自身的Logback框架,在一個項目中其context_name只能定義一次,
所以,在項目啟動時,Alibaba Nacos的Logback先加載完成后,再加載項目本身的Logback時就出現了沖突,報錯誤日志 “ Failed to rename context [logback] as [nacos] java.lang.IllegalStateException: Context has been already given a name ” ,但是不影響使用,
解決這個,只要禁用掉其中一個Logback就可以了,一般禁用外部框架夾帶的Logback即可
處理方法分別如下:
1、修改自定義的logback.xml的contextName屬性與nacsos-client.jar的配置保持一致
2、啟動命令添加配置 -Dnacos.logging.default.config.enabled=false,該配置在nacos加載時,讀取系統配置
3、在啟動類的main方法中設置系統參數
https://blog.csdn.net/shijinting/article/details/113858339?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1
解決項目啟動 logback 配置加載失敗 問題定位/處理
問題1 :Failed to rename context [springAppName_IS_UNDEFINED]
原因:logback配置 動態獲取當前項目 應用名 獲取失敗
解決方案:將 獲取方式 由 <property name="APP_NAME" value="${spring.application.name}" />
改為
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
參考文檔 https://blog.csdn.net/qq_42533633/article/details/106267861
問題2 :Context has been already given a name nacos
原因:項目框架 集成logback 與nacos 自帶的logback 沖突, nacos的logback 已經先於 項目啟動,logback 本身 在命名之后不允許二次修改contextName的名字,問題在阿里nacos 官方git上已有人提出,
https://github.com/alibaba/nacos/issues/1959
目前的解決方案是 在啟動類 加入 System.setProperty("nacos.logging.default.config.enabled", "false");
含義:將該項目對應的nacos日志服務 禁用
https://www.jianshu.com/p/6b7cbb51e98f