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

Posted

技术标签:

【中文标题】将 log4j2 与 slf4j 一起使用:java.lang.***Error【英文标题】:Using log4j2 with slf4j: java.lang.***Error 【发布时间】:2015-11-28 18:06:36 【问题描述】:

所以我尝试按照this(非maven 实现)和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.***Error
    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)...

知道我哪里出错了吗?

【问题讨论】:

可以看slf4j.org/codes.html#multiple_bindings如何排除log4j :-) 【参考方案1】:

您正在使用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 正在将 log4j 调用发送回 slf4j。 删除这个

【讨论】:

可以在 Gradle 中移除 log4j-to-sl4j:configurations all*.exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j' 跨度> 我的情况是去掉上面的那个,猜两个都可以。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于将 log4j2 与 slf4j 一起使用:java.lang.***Error的主要内容,如果未能解决你的问题,请参考以下文章

Log4j2与Slf4j的最佳实践

Slf4j与log4j及log4j2的关系及使用方法

log4j2 核弹大锅,顺便学习SLF4J与log4j2

log4j2与slf4j日志桥接

如何将 log4j2 与 spring boot 执行器一起使用

log4j2中的MDC分析