在使用log4j2和slf4j时出现java.lang.StackOverflowError错误

48

所以我尝试遵循这个(非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)...

我哪里做错了,有什么想法吗?


您可以访问 https://www.slf4j.org/codes.html#multiple_bindings 查看如何排除log4j :-) - Jorge Novo
3个回答

80

您正在使用 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。请移除此文件


9
你可以在Gradle中移除log4j-to-slf4j: configurations { all*.exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' } - dmotta
我的情况是删除上面的一个,猜测任何一个都可以。 - zinking

3

请注意,如果您的类路径中有 logback,则也必须将其删除!


1

想法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'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接