Java ClassCastException:org.slf4j.impl.Log4jLoggerAdapter无法强制转换为ch.qos.logback.classic.Logger
为了在运行时添加一个appender,我遵循了这个答案。尽管这对最初的海报有效,但我在第Java ClassCastException:org.slf4j.impl.Log4jLoggerAdapter无法强制转换为ch.qos.logback.classic.Logger,java,logging,log4j,slf4j,logback,Java,Logging,Log4j,Slf4j,Logback,为了在运行时添加一个appender,我遵循了这个答案。尽管这对最初的海报有效,但我在第Logger-Logger=(Logger)LoggerFactory.getLogger(“abc.xyz”): 简单的问题。。。为什么这对他有效而对我无效-P这看起来像是类路径中具有相同依赖项(slf4j)的多个版本的症状 在日志中查找此消息: SLF4J:类路径包含多个SLF4J绑定。 它将默认使用在类路径中找到的第一个slf4j引用。在过去,我通过将Logback依赖项(Logback classic
Logger-Logger=(Logger)LoggerFactory.getLogger(“abc.xyz”)代码>:
简单的问题。。。为什么这对他有效而对我无效-P这看起来像是类路径中具有相同依赖项(slf4j)的多个版本的症状
在日志中查找此消息:
SLF4J:类路径包含多个SLF4J绑定。
它将默认使用在类路径中找到的第一个slf4j引用。在过去,我通过将Logback依赖项(Logback classic和Logback core)移动到Maven pom.xml文件的dependencies部分的顶部来解决这个问题,该部分将它们放在类路径的前面。这是一个脆弱的解决方案,根据您的应用程序体系结构,它可能无法工作。(例如,如果您的启动项目在其pom.xml中包含冲突的依赖项,并且您通过另一个项目及其pom.xml引用了Logback)由于您的项目或某些其他继承项目中已经存在SLF4J的依赖项,运行时可能会发生冲突。在我的POM
文件中添加排除项对我来说很有效:
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
org.slf4j
slf4j-log4j12
在这种情况下,请确保用于Logger和LoggerFactory的库应相同
例如,如果LoggerFactory来自slf4j,则记录器不应为log4j或java.util。确保它也来自slf4j。
如果您仍然面临此问题,请告诉我。我通过使用logback类库解决了此问题,并避免使用slf4j。slf4j只是一个抽象概念,不是必须使用的。下面是代码片段
导入以下类
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
LoggerContext context = new LoggerContext();
Logger logger = context.getLogger("testLogger");
给你。您有一个logger和LoggerContext。检查您从中获取logger和LoggerFactory的库,它们应该是相同的。
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
LoggerContext context = new LoggerContext();
Logger logger = context.getLogger("testLogger");