slf4j和log4j2一起使用是否值得


114

我无法决定是否将slf4j与log4j2一起使用。根据在线帖子,看起来它不会对性能产生任何影响,但这确实是必需的。

同样,以下几点有利于log4j2:

  • SLF4J强制您的应用程序记录字符串。如果要记录文本,Log4j 2 API支持记录任何CharSequence,还支持按原样记录任何对象。
  • Log4j 2 API提供了对记录消息对象,Java 8 lambda表达式和无垃圾记录的支持(它在记录CharSequence对象时避免创建vararg数组并避免创建String)。

2
也许。如果我的应用程序服务器包含slf4j并注销(或log4jv1)怎么办?然后,我应该被迫安装第三个记录器以使用您的应用程序吗?还是公司安全性决定您只能java.util.logging在生产中使用,那又如何?
艾略特·弗里施

感谢您的来信。但是,如果每个人都在使用log4j org宽,则上述参数将无效。
Andy897'1

4
使用SLF4J意味着,如果公司政策发生变化(例如,收购公司并强加了新政策时),更换实施非常容易。现在,在编写代码时使用SLF4J不会比直接使用Log4j花费更多的时间。稍后替换直接Log4j调用将花费大量时间。SLF4J是未来的免费投资/保险。这比Log4j 2 API功能重要吗?只有您(或公司政策)可以决定。
安德里亚斯(Andreas)

如果愿意,是否甚至可以将slf4j与log4j2一起使用?此页面显示了log4j的用法-版本1.2-即将终止),但log4j2则没有任何选择。如果有办法,为什么slf4j不提?
J Woodchuck

Answers:


162

继续:编程到log4j2 API而不是slf4j

是安全的:Log4j2 API提供与slf4j完全相同的保证-甚至更多。

现在,Log4j2本身已分为一个API和一个实现模块,使用SLF4J不再具有任何价值。

是的,保持选件开放是一种好的工程实践。您稍后可能想要更改为另一个日志记录实现。

在过去的10年左右的时间里,在应用程序中建立这种灵活性意味着要使用包装器API(如SLF4J)。但是,这种灵活性并不是免费的:这种方法的缺点是您的应用程序无法使用基础日志库的更丰富的功能集。

Log4j2提供了一种解决方案,它不需要将应用程序限制为最低公分母。

溢流阀:log4j-sf4j

Log4j2包括一个log4j-to-slf4j桥接模块。任何使用Log4j2 API编码的应用程序都可以随时选择将支持实现转换为任何符合slf4j的实现。

从log4j到slf4j

正如问题中提到的,与使用诸如slf4j之类的包装器API相比,使用Log4j2 API直接提供更多功能并具有一些非功能性优势:

  • 讯息API
  • Lambda用于懒惰的日志记录
  • 记录任何对象而不只是字符串
  • 免垃圾:尽可能避免创建变量或字符串
  • 完成后,CloseableThreadContext会自动从MDC中删除项目

(有关更多详细信息,请参见SLF4J中不提供的10个Log4j2 API功能。)

应用程序可以安全地使用Log4j2 API的这些丰富功能,而不必锁定在本机Log4j2核心实现中。

SLF4J仍然是您的安全阀,但这并不意味着您的应用程序不再应该针对SLF4J API进行编码。


披露:我为Log4j2做贡献。


更新:似乎有些困惑,对Log4j2 API进行编程会以某种方式引入“门面外观”。Log4j2 API和SLF4J在这方面没有区别。

使用本地实现时,两个API都需要2个依赖关系,而对于非本地实现,这两个API都需要4个依赖关系。在这方面,SLF4J和Log4j2 API相同。例如:

SLF4J和Log4j 2 API所需的依赖项相似


7
我明白。让我改一下我的问题。除了log4j2之外,log4j2 API是否有任何独立的实现?
Ceki

5
Log4j2 API和impl 没有 “紧密耦合”。所有这些SLF4J实现都是可用的:根据Log4j2 API编码的应用程序可以选择log4j-to-slf4j依赖性,而不是log4j-core选择您提到的所有这些SLF4J实现。Log4j2 API 的本机实现的数量无关紧要。
雷姆波波玛17年

19
问题是您经常依赖于自己使用slf4j的库,因此坚持下去会更容易。
达维奥

18
所以,我应该使用接口来实现接口吗?是的,不,谢谢。Slf4j通过提供良好的日志记录实现接口击败了log4j ... log4j2应该只实现slf4j api-如果有缺少的功能,请将其归还,如果slf4j不会采用新的功能,那么也许有一个log4j2 api接口的情况....
RockMeetHardplace

4
@RemkoPopma-您仍然反对使用log4j界面。是的,我知道了-我可以链接log4j2的接口-> slf4j的接口->任何实现,但我宁可不要抽象该抽象-谢谢,不用了。
RockMeetHardplace
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.