出现异常 org.apache.logging.slf4j.SLF4JLoggerContext 无法转换为 org.apache.logging.log4j.core.LoggerContext

问题描述 投票:0回答:3

我的代码使用 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)

为什么一个简单的程序会出现异常?

java exception log4j
3个回答
85
投票

从类路径中删除以下 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.


14
投票

我正在使用 Maven。我发现在

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


感谢 @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>

0
投票

对于这种情况,

log4j-core
log4j-to-slf4j
不应一起使用。派生的
LoggerContext
无法转换为 log4j-core。如果您想使用 log4j 到 slf4j 适配器,您应该删除
log4j-core
并仅添加
log4j-api
log4j-to-slf4j


我在elasticsearch和spring boot中也遇到了类似的问题。 Elasticsearch 6.8.2 使用 log4j 2.7.11。当我排除 log4j-core 依赖项时,我面临这样的问题:

java.lang.NoClassDefFoundError:org/apache/logging/log4j/core/Configurator

我找到了模拟 log4j-core 的解决方案:https://github.com/elastic/elasticsearch/issues/19415#issuecomment-301057712

© www.soinside.com 2019 - 2024. All rights reserved.