Log4j vs SLF4J

2025年3月17日 | 阅读 3 分钟

SLF4J(Simple Logging Faade for java)是一个API,旨在为许多日志框架提供通用访问,log4j是其中之一。

它基本上是一个抽象层。它不是日志记录实现。这意味着如果您正在编写一个库并使用 SLF4J,您可以将该库提供给其他人使用,他们可以选择与 SLF4J 一起使用哪个日志记录实现,例如 log4j 或 Java 日志记录 API。它用于防止应用程序依赖于不同的日志记录 API,就像它们使用依赖于它们的库一样。

但是,我们详细阐述了 Log4J 和 SLF4J 之间的区别,只需要一行答案。即,问题本身是错误的。 SLF4J 和 Log4J 是不同的,或者它们不是相似的组件。正如名称所指定的那样,SLF4J 是 java 的一个简单的日志记录 faade。它不是一个日志记录组件,甚至不进行实际的日志记录。它只是底层日志记录组件的抽象层。

Log4j 的情况下,它是一个日志记录组件,并且按照指示进行日志记录。因此,我们可以说 SLF4J 和 Log4J 在逻辑上是两个不同的东西。

Log4j vs SLF4J

现在,您必须选择需要在运行时使用哪个日志记录框架。为此,您需要包含两个 jar 文件

  • SLF4J 绑定 jar 文件
  • 所需的日志记录框架 jar 文件

例如,要在您的项目中使用 log4j,您需要包含下面给出的 jar 文件

  • slf4j-log4j12-1.7.12.jar
  • log4j-1.2.17.jar

将两个 jar 文件都放在应用程序类路径中后,SLF4J 会自动检测到它,并开始使用 log4j 来处理日志语句,基于您在 log4j 配置文件中提供的配置。

例如,您可以在项目类文件中编写以下代码

为什么 SLF4J 比 Log4J 更好?

始终难以在 SLF4J 和 Log4j 之间做出选择。如果您有选择,我建议您;日志记录抽象始终优于日志记录框架。如果您使用日志记录抽象(尤其是 SLF4J),我们可以在部署时迁移到我们需要的任何日志记录框架,而无需选择单个依赖项。

以下是有充分理由选择 SLF4J 而不是 Log4j 的原因

  • 使用抽象总是更好。
  • SLF4J 是一个开源库或内部库,它使其独立于任何特定的日志记录实现,这意味着无需为多个库管理多个日志记录配置。
  • SLF4J 提供基于占位符的日志记录,通过删除像 isInforEnabled()、isDebugEnabled() 等检查来提高代码的可读性。
  • 通过使用 SLF4J 的日志记录方法,我们可以延迟构造日志消息(字符串)的成本,直到您需要它为止,这既节省 CPU 又节省内存。
  • 由于 SLF4J 使用较少数量的临时字符串意味着垃圾收集器的工作量较少,这意味着您的应用程序具有更好的吞吐量和性能。

因此,本质上,SLF4J 不会取代 log4j;它们一起工作。它消除了您的应用程序对 log4j 的依赖,并使其将来更容易用功能更强大的库替换它。


下一主题#