在slf4j中使用log4j2: java.lang.StackOverflowError[英] Using log4j2 with slf4j: java.lang.StackOverflowError

本文是小编为大家收集整理的关于在slf4j中使用log4j2: java.lang.StackOverflowError的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

因此,我尝试遵循 this 他们的网站用于将slf4j添加到log4j.并尝试使用此代码

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

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

  • log4j-api2.3.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.jar和log4j-to-slf4j-2.3.jar.

创建一个呼叫环

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

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

其他推荐答案

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

其他推荐答案

想法1:

上述答案有效.我的是一个多模块项目,log4j-to-slf4j-2.3.jar依赖性是通过其他项目的拉动.我不得不扫描每个项目,以找出正在为此提取的项目.我使用以下命令在项目级别进行操作.

gradlew common:dependencies --configuration runtime

common是项目的名称 configuration runtime - 您可以更改此操作以适合您的需求


想法2:

如果您使用的是具有多模块项目的春季.然后,您可以简单地在每个子标记的build.gradle或dependency.gradle

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

本文地址:https://www.itbaoku.cn/post/1575171.html

问题描述

So I have tried following this (non-maven implementation) and requirements in their web site for adding slf4j to log4j. and tried using this code

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

and added the following to my library

  • 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

when I try running it I get the following error

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)...

Any idea where I am going wrong?

推荐答案

You're creating a call-loop with log4j-slf4j-impl-2.3.jar and log4j-to-slf4j-2.3.jar.

log4j-slf4j-impl-2.3.jar is the implementation of the adapter that sends slf4j calls to log4j.

log4j-to-slf4j-2.3.jar is sending log4j calls right back to slf4j. Remove this one.

其他推荐答案

Just in case, if you have logback in your classpath, it must be removed as well!

其他推荐答案

Idea 1:

The above answer works. Mine was a multi module project and the log4j-to-slf4j-2.3.jar dependency was being by pulled by a different project. I had to scan each project to figure which project was pulling in this. I used the following command to do at a project level.

gradlew common:dependencies --configuration runtime

common is the name of the project configuration runtime - you can change this to suit your need


Idea 2:

If you are using spring which has multi module projects. Then you can simply add the following config in every subproject's build.gradle or dependency.gradle

configurations {
    all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}