📜  Log4j与SLF4J

📅  最后修改于: 2021-01-06 09:14:40             🧑  作者: Mango

Log4j和SLF4J

SLF4J(用于Java的简单日志记录外观)是一种API,旨在提供对许多日志记录框架的通用访问,其中log4j是其中之一。

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

但是,我们详细介绍了Log4J和SLF4J之间的区别,该区别仅应获得一个行答案。即,问题本身是错误的。 SLF4J和Log4J不同,或者它们不是相似的组件。就像指定的名称一样,SLF4J是Java的简单日志记录外观。它不是日志记录组件,甚至也不执行实际的日志记录。它只是底层日志记录组件的抽象层。

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

现在,您只需选择运行时需要使用的日志记录框架即可。为此,您将需要包括两个jar文件:

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

例如,要在您的项目中使用log4j,您将需要包含以下jar文件:

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

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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld
{
    public static void main(String[] args)
    {
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);
        logger.info("Hello World");
    }
}

为什么SLF4J比Log4J更好?

在SLF4J和Log4j之间总是很难选择一个。如果您有选择,我建议您;日志记录抽象总是比日志记录框架更可取。如果您使用日志记录抽象,尤其是SLF4J,则可以迁移到部署时所需的任何日志记录框架,而无需选择单一依赖项。

以下是原因,足以选择SLF4J而不是Log4j:

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

因此,从本质上讲,SLF4J不会替代log4j。他们俩一起工作。它从您的应用程序中删除了对log4j的依赖,并使得将来使用功能更强大的库轻松替换它。