将log4j2与slf4j一起使用:java.lang.StackOverflowError

时间:2015-09-03 03:41:56

标签: java slf4j log4j2

所以我尝试在this中跟踪web site(非maven实现)和要求,将slf4j添加到log4j。并尝试使用此代码

public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Main.class);
        logger.info("test");
    }

并将以下内容添加到我的库中

  • 的log4j-API-2.3.jar
  • log4j的核-2.3.jar
  • 的log4j-sl4j-IMPL-2.3.jar
  • 的log4j到sl4j-2.3.jar
  • SLF4J-API-1.7.12.jar

当我尝试运行它时,我收到以下错误

Exception in thread "main" java.lang.StackOverflowError
    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
    at java.util.concurrent.ConcurrentHashMap.containsKey(ConcurrentHashMap.java:964)
    at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:40)
    at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
    at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
    at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
    at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)
    at org.apache.logging.slf4j.SLF4JLoggerContext.getLogger(SLF4JLoggerContext.java:41)
    at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:37)
    at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:29)
    at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:47)
    at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:29)
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:284)...

知道我哪里错了吗?

3 个答案:

答案 0 :(得分:33)

您正在使用log4j-slf4j-impl-2.3.jarlog4j-to-slf4j-2.3.jar创建一个调用循环。

log4j-slf4j-impl-2.3.jar是将slf4j调用发送到log4j的适配器的实现。

log4j-to-slf4j-2.3.jar正在将log4j调用发送回slf4j。 删除此

答案 1 :(得分:2)

以防万一,如果您在类路径中有 logback ,也必须将其删除!

答案 2 :(得分:0)

想法 1:

以上答案有效。我的是一个多模块项目,log4j-to-slf4j-2.3.jar 依赖项是由另一个项目拉取的。我必须扫描每个项目才能确定哪个项目正在参与其中。我在项目级别使用了以下命令。

gradlew common:dependencies --configuration runtime

common 是项目名称 configuration runtime - 您可以更改它以满足您的需要


想法 2:

如果您使用具有多模块项目的 spring。然后您可以简单地在每个子项目的 build.gradledependency.gradle

中添加以下配置
configurations {
    all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}