Using log4j2 with slf4j: java.lang.StackOverflowError



所以我试着按照这个(非maven实现)和要求在他们的网站上添加slf4j到log4j。并尝试使用此代码

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

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

  • log4j-api-2.3.jar
  • log4j-core-2.3.jar
  • log4j-sl4j-impl-2.3.jar
  • log4j-to-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)...

你知道我哪里错了吗?

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

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

log4j-to-slf4j-2.3.jar正在向slf4j发送log4j调用。删除这个

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

想法一:

以上答案有效。我的项目是一个多模块项目,log4j-to-slf4j-2.3.jar依赖是由一个不同的项目拉出来的。我必须扫描每个项目,找出是哪个项目在拉动这个。我在项目级别使用了以下命令。

gradlew common:dependencies --configuration runtime

common为项目名称configuration runtime -你可以根据需要修改


想法二:

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

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

相关内容