将 log4j2 与 slf4j 结合使用:java.lang.StackOverflowError
Using log4j2 with slf4j: java.lang.StackOverflowError
所以我尝试按照 this (non-maven implementation) and requirements in their web site 将 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.WhosebugError
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:
如果您正在使用具有多模块项目的 spring。然后你可以简单地在每个子项目的 build.gradle
或 dependency.gradle
中添加以下配置
configurations {
all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
所以我尝试按照 this (non-maven implementation) and requirements in their web site 将 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.WhosebugError
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:
如果您正在使用具有多模块项目的 spring。然后你可以简单地在每个子项目的 build.gradle
或 dependency.gradle
configurations {
all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}