获取异常org.apache.logging.slf4j.SLF4JLoggerContext无法强制转换为org.apache.logging.log4j.core.LoggerContext

时间:2014-09-17 13:19:30

标签: java exception log4j

使用apache-log4j-2.0.2我的代码非常简单:

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;

public class Log4jtest {
  static Logger log =Logger.getLogger(Log4jtest.class);
  public static void main(String[] args) {
    BasicConfigurator.configure();
        log.debug("This is debug message");
  }

}

但是我得到例外:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ClassCastException: org.apache.logging.slf4j.SLF4JLoggerContext cannot be          cast to org.apache.logging.log4j.core.LoggerContext``
at org.apache.log4j.Logger.getLogger(Logger.java:41)
at Log4jtest.<clinit>(Log4jtest.java:11)

为什么异常来自一个简单的程序?

2 个答案:

答案 0 :(得分:61)

  

从类路径中删除下面的jar,它应该解决问题 -

log4j-to-slf4j-2.0.2.jar
log4j-to-slf4j-2.0.2-sources.jar
log4j-slf4j-impl-2.0.2.jar
log4j-slf4j-impl-2.0.2-sources.jar
  

下载后我能够复制并解决问题   apache-log4j-2.0.2来自       http://www.apache.org/dyn/closer.cgi/logging/log4j/2.0.2/apache-log4j-2.0.2-bin.zip

答案 1 :(得分:4)

我正在使用Maven。我发现在log4j列表的顶部(在使用slf4j的Spring Boot之前)声明我的<dependencies> / logback依赖项解决了这个问题。

对于@TheCodingFrog来说,在我的Spring Boot依赖项中添加排除项也解决了这个问题。像这样:

<dependencies>
    <dependency>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <exclusions>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>*</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

注意:如果您关心实际使用哪种日志框架,可能的一个重要区别是,使用@TheCodingFrog的方法,slf4j保留logback为绑定:

SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

然而,根据我使用的方法,使用了slf4j / log4j

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

如果有人对此感兴趣,我使用的log4j / slf4j依赖关系是:

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.7</version>
</dependency>