为啥在 Log4j2 上使用 Slf4j 时 log4j-slf4j-impl 不依赖于 log4j-core

Posted

技术标签:

【中文标题】为啥在 Log4j2 上使用 Slf4j 时 log4j-slf4j-impl 不依赖于 log4j-core【英文标题】:Why has log4j-slf4j-impl no dependency on log4j-core when using Slf4j over Log4j2为什么在 Log4j2 上使用 Slf4j 时 log4j-slf4j-impl 不依赖于 log4j-core 【发布时间】:2016-04-23 23:05:49 【问题描述】:

我想使用 log4j2 作为我的 slf4j 日志记录应用程序的日志记录实现。

The documentation 声明我必须依赖 log4j-slf4j-impl 和 log4j-core。

我的问题是为什么 log4j-slf4j-impl 不依赖于 log4j-core(因此带来了它肯定需要的库)?

【问题讨论】:

您能提供更多信息吗?也许提供一些关于你的应用、你的依赖甚至你的 pom 的信息? 我的问题与项目无关。这就是为什么 log4j2 的开发人员选择强迫我在我的 pom 中放置 2 个依赖项,如果我显然只需要一个,即log4j-slf4j-impllog4j-core 依赖是,imo,隐含其中,我想知道他们为什么选择这样构建。 【参考方案1】:

从技术上讲,SLF4J 桥只需要 Log4j 2 API。您可以构建自己的 Log4j 2 API 实现并包含它而不是 Log4j 2 核心 jar。

如果您想知道为什么开发人员选择这样构建它,您是否认为如果您在 log4j 开发人员邮件列表中询问,您会更有可能得到准确的答案?

【讨论】:

重点是,当我选择 log4j-slf4j-impl 时,我已经选择了我的日志记录 implementation (并隐含 slf4j 作为接口)。再次间接意味着为实现提供实现。我同意,这简直是令人毛骨悚然。 我选择 *** 而不是 developer-mailing-list 因为我认为它可能是更公开的地方。 通过选择log4j-slf4j-impl,您选择了 SLF4J 桥接实现;不是 log4j 实现。 log4j-slf4j-impl 显然可以与任何实现 Log4j 2 API 的东西一起使用。这就是为什么它不绑定到特定的实现。

以上是关于为啥在 Log4j2 上使用 Slf4j 时 log4j-slf4j-impl 不依赖于 log4j-core的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 应用程序中指定 Log4j2 配置文件

Log4j2与Slf4j的最佳实践

Logback,SLF4J,Log4J2。了解它们并学习如何使用。(翻译)

如何在 Junit 中使用 slf4j 模拟 log4j2 记录器对象

使用 slf4j 绑定自定义 log4j2 包装器

slf4j & log4j2 maven 设置查询