Log4j、SLF4J和Logback有什么区别?

109

我有点困惑这三个日志记录库。看起来它们可以在Java日志记录中做类似的事情...


1
它们做类似的事情,但它们有不同的API。我会使用你最喜欢的那个。顺便提一下,看看log4j2而不是log4j。 - Peter Lawrey
4
除了slf4j外,其他都是日志记录器(logger)本身。而slf4j不是日志记录器本身,它是一个门面(facade),旨在为另一个日志记录器提供一致的API。 - Elliott Frisch
@ElliottFrisch 好观点,不过我使用的是 slf4j-simple,它不需要另一个记录器。 - Peter Lawrey
6
为什么这个问题会收到两个负面投票? - Prashant Prabhakar Singh
4
这里有一些基准测试:https://www.loggly.com/blog/benchmarking-java-logging-frameworks/ - Foyta
欢迎来到市集! - Arfur Narf
3个回答

155

请查看它们的主页:

SLF4J - 简单日志门面(SLF4J)是一个简单的门面或抽象1,它为各种记录框架(例如 java.util.logging、logback、log4j)提供服务,允许最终用户在部署时插入所需的记录框架。

1) 它本身不是一个记录库,而是到许多记录库之一的通用接口。

Log4j 1.2 - 欢迎使用 Apache log4j,这是一个Java的记录库

Logback - Logback旨在成为流行的log4j项目的继任者,接手log4j的位置。

Log4j 2 - Apache Log4j 2是Log4j的升级版,相对于前任Log4j 1.x,在许多方面进行了显着改进,并且提供了Logback中可用的许多改进,同时修复了Logback架构中一些固有的问题。

至少,这就是它们各自所说的。


6
有了 SLF4J 作为门面,我们可以使用log4j、logback 或任何其他兼容的日志框架。是这样吗? - Shekhar
4
@Shekhar 是的,那是正确的。 - Atefeh
SLF4J 不是一个日志库并不完全正确。它是一个日志库,特别是在使用 slf4j-simple 提供程序时。 - Philippe Cloutier
@PhilippeCloutier 没有人认为SLF4J是一个“日志记录库”。它是一个API。它提供的简单记录器很少被使用。 - rgoers

12

这个链接:https://medium.com/@krishankantsinghal/logback-slf4j-log4j2-understanding-them-and-learn-how-to-use-d33deedd0c46

详细解释了它们之间的区别。

引用自该文章:

Slf4j

简单日志门面(Simple Logging Facade for Java)作为一个简单的外观或抽象,为各种日志框架提供服务,允许最终用户在部署时插入所需的日志框架。

log4j2

Log4j、Logback和java.util.Logger是实际编写日志的日志库,并具有各自的优缺点。行业标准是Log4j2和Logback。

我建议您阅读这篇博客。它提供了所有关于如何使用适配器来同时使用两者的细节。


你所提到的文章包含了一些有价值的信息,但质量较低。其中包括错误的信息(包括评论中报告的一个重大错误)。它有一些有趣的图形,但我认为其中一些违反了SLF4J版权。因此,我会给这篇文章点个踩,以支持Andreas的回答,虽然他的回答也远非完美,但在我看来更好。 - Philippe Cloutier

6

你的问题并不容易,只覆盖了Java生态系统中令人困惑的日志记录的一些主要元素。我不太了解这个生态系统,无法完全描述它,但描述当前情况以及如何形成它肯定需要数天/数周的工作才能编写出类似书籍的内容。

以下是一个非常简短,肯定过于简单化的答案,重点关注您提到的元素。

Log4j在2001年作为灵活的日志记录库出现。

Logback是作为Log4j的更强大替代品从2006年到2011年开发的。在2005年至2006年间,Simple Logging Facade for Java (SLF4J)被开发为优秀的替代方案来替代[Apache/Jakarta] Commons Logging (JCL)。Logback和SLF4J是相互补充的(可以一起使用或分别使用)。

可能是因为Logback和SLF4J在某种程度上是商业化的,所以Apache基金会在2014年发布了Log4j的重大升级。 Log4j 2在某种程度上类似于Logback+SLF4J,它提供了一个门面API(log4j-api,类似于SLF4J)以及一个实现(log4j-core,类似于Logback)。

如果以上内容似乎与其他来源相矛盾,那可能是因为Log4j版本1非常不同且仍在使用中,因此描述“Log4j”的来源实际上仍然可能描述Log4j 1。


很好的答案!Log42(或更好的Log4j2 API + Log4j2 Core)与SLF4J + Logback完全相同:两者都由单个实体开发(Ceki Gülcü用于SLF4J + Logback,Apache Logging Services PMC用于Log4j2 API + Log4j2 Core),两个后端主要受其API的变化驱动(反之亦然)。此外,两个API都可以与两个后端一起使用。 - Piotr P. Karwasz
Log4j和SLF4J+Logback是可比较的,但是虽然Log4j是一种解决方案,我认为Logback和SLF4J是高度互补的产品。与Log4j不同,例如SLF4J具有slf4j-simple,它允许单独使用它,而无需Logback。而Logback提供了logback-classic,这是一个模块,可以与SLF4J集成。这可能是微妙之处,但我宁愿不过于简化,因为这个主题已经足够复杂了! - Philippe Cloutier
这是我个人的看法,由于Log4j2 API和Log4j2 Core共享相同的名称,因此存在一种误解。与SLF4J一样,Log4j2 API具有简单绑定(包含在log4j-api中)和到所有主要日志框架(即Logback、java.util.logging和JBoss LogManager)的绑定。出于明显的原因,它仅缺少与Log4j 1.x的绑定。 - Piotr P. Karwasz
嗯,有趣。如果log4j-api“包含”了“一个简单的绑定”到它自己,我猜那更像是一种实现而不是一个“正确的绑定”,但无论如何,我找不到任何相关文档。并不是我对你的说法有所怀疑,但这样的功能肯定会在某个地方有文档记录吧? - Philippe Cloutier
文档很难找到。要配置SimpleLoggerContext,您需要使用系统属性,这些属性在这里记录。偶尔会出现像这样的问题 - Piotr P. Karwasz
啊哈,我明白了。谢谢Piotr。 - Philippe Cloutier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接