我无法决定是否对log4j2使用slf4j.根据在线帖子,它看起来不会对性能造成任何影响,但它确实是必需的.

此外,这些点的规则有利于log4j2:

  • SLF4J强制应用程序记录字符串.如果要记录文本,Log4j 2 API支持记录任何字符序列,但也支持按原样记录任何对象.
  • Log4j 2 API支持记录消息对象、Java 8 lambda表达式和无垃圾日志(log)记录(它避免在记录CharSequence对象时创建vararg数组和字符串).

推荐答案

Go ahead: program to the log4j2 API instead of slf4j

It's safe: the Log4j2 API offers the exact same guarantees as slf4j - and more.

既然Log4j2本身被分为API和实现模块,那么使用SLF4J就没有任何价值了.

是的,保留您的 Select 余地是很好的工程实践.您可能希望稍后更改为另一个日志(log)记录实现.

在过go 10年左右的时间里,在您的应用程序中构建这样的灵活性意味着要使用像SLF4J这样的包装器API.然而,这种灵活性并不是免费的:这种方法的缺点是您的应用程序不能使用底层日志(log)记录库的更丰富的特性集.

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

The escape valve: log4j-to-slf4j

Log4j2包括一个log4j-to-slf4j桥模块.任何根据Log4j2 API编码的应用程序都可以随时 Select 将支持实现切换到任何符合slf4j的实现.

log4j-to-slf4j

如问题中所述,与使用slf4j等包装器API相比,直接使用Log4j2 API提供了更多功能,并具有一些非功能性优势:

  • 消息接口
  • 用于懒惰日志(log)记录的lambdas
  • 记录任何对象,而不仅仅是字符串
  • 无垃圾:尽可能避免创建变量或字符串
  • CloseableThreadContext会在您完成任务后自动从MDC中删除项目

(有关更多详细信息,请参见10 Log4j2 API features not available in SLF4J.)

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

SLF4J仍然是您的安全阀,只是这并不意味着您的应用程序应该再使用SLF4J API进行编码.


Disclosure: I contribute to Log4j2.


更新:对log4j2api的编程以某种方式引入了"facade for a facade",这似乎有些混乱.Log4j2 API和SLF4J在这方面没有区别.

两个API在使用本机实现时都需要2个依赖项,而非本机实现则需要4个依赖项.SLF4J和Log4j2 API在这方面是相同的.例如:

Required dependencies with log4j-api as API with SLF4J as API
Log4j 2 as implementation 2: log4j-api and log4j-core 4: slf4j, log4j-slf4j-impl, log4j-api, log4j-core
Logback as implementation 4: log4j-api, log4j-to-slf4j, slf4j, Logback 2: slf4j and Logback

Java相关问答推荐

使用ExecutorService时在ThreadFactory中触发自定义newThread函数

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

我想了解Java中的模块化.编译我的应用程序时,我有一个ResolutionException

强制Mockito返回null而不是emtpy list

缩小画布比例后更改滚动窗格的内部大小

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

调用引发泛型异常的泛型方法时出现编译错误

我可以在MacOS上使用什么Java函数来在适当的设备上以适当的音量播放适当的alert 声音?

基于接口的投影、原生查询和枚举

Android Java:已设置但未读取SharedPreferences

有没有办法在o(log(N))中以系统的方式将数组中的小块元素复制和移动到新增长的数组中的左侧?

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

如何设计包含已知和未知键值对映射的Java类?

在单例类上获取Java锁,了解原因

从字节数组切换到JakartaMail org.springframework.mail.javamail.JavaMailSender InputStreamResource

无泄漏函数的Java DRY

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

如何转换Vector<;对象>;转换为int?

OpenAPI Maven插件生成错误的Java接口名称

Swagger.io OpenApi v3.0 声明默认媒体类型