是否值得将 slf4j 与 log4j2 一起使用

2023-12-06

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

这些观点也有利于 log4j2:

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

继续:使用 log4j2 API 而不是 slf4j 进行编程

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

既然Log4j2本身被分成了API和实现模块,那么使用SLF4J就不再有任何价值了。

是的,保持您的选择余地是良好的工程实践。您稍后可能想更改为另一个日志记录实现。

在过去 10 年左右的时间里,在应用程序中构建这种灵活性意味着使用 SLF4J 等包装器 API。不过,这种灵活性并不是免费的:这种方法的缺点是您的应用程序无法使用底层日志记录库的更丰富的功能集。

Log4j2 提供的解决方案不要求您的应用程序仅限于最低公分母。

逃逸阀:log4j-to-slf4j

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

log4j-to-slf4j

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

  • 消息接口
  • 用于惰性日志记录的 Lambda
  • 记录任何对象而不仅仅是字符串
  • 无垃圾:尽可能避免创建可变参数或创建字符串
  • 当您使用完项目后,CloseableThreadContext 会自动从 MDC 中删除项目

(See SLF4J 中不可用的 10 个 Log4j2 API 功能更多细节。)

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

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


披露:我为 Log4j2 做出了贡献。


更新:Log4j2 API 编程以某种方式引入了“外观的外观”,这似乎有些混乱。 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否值得将 slf4j 与 log4j2 一起使用 的相关文章

随机推荐

  • PHP:如何访问函数内部已在函数外部声明的变量?

    在每个页面的开头 我包含一个启动会话等的文件 我们称之为session php 在这个文件中session php 我包含一个包含函数的文件 我们称之为function1 php 因为我需要该功能可用session php 但是 稍后在主页
  • Groovy 中的类转换异常

    我想使用 grails 上的 groovy 上传图像 我的gsp页面如下 我显示的是原始的简化版本
  • XSD 断言无法识别

    我有一个 XSD 我想在其中使用xs assert陈述 问题是我不知道如何使断言功能可供我使用 我正在使用 Visual Studio 编写它 它会出现一条蓝线 表示它不支持断言元素 我的 XSD 看起来像这样
  • 检测移动浏览器

    我正在寻找一个函数 如果用户是否使用移动浏览器 该函数会返回布尔值 我知道我可以使用navigator userAgent并使用正则表达式编写该函数 但用户代理对于不同的平台来说太多样化了 我怀疑匹配所有可能的设备会很容易 而且我认为这个问
  • 多个文件是否存储在一个块中?

    当我将许多小文件存储到 HDFS 中时 它们会存储在单个块中吗 在我看来 根据此讨论 这些小文件应该存储到单个块中 HDFS 块大小与实际文件大小 引用自Hadoop 权威指南 HDFS 存储小文件效率低下 因为每个文件都存储在一个块中 并
  • Expect - 根据行和列从屏幕区域获取变量

    我正在使用 Expect 与 SSH 会话和 ERP 程序自动交互 不是依赖正则表达式来捕获我的预期脚本中的变量 是否可以在收到用户的特定击键后将屏幕区域 例如一个字段 捕获到代码中的变量中 向服务器发送一些其他命令并重新发送该字段 假设订
  • 递归 ConcurrentHashMap.computeIfAbsent() 调用永远不会终止。错误还是“功能”?

    前一段时间 我在博客中介绍了一种递归计算斐波那契数的 Java 8 函数方法 有一个ConcurrentHashMap缓存和新的 有用的computeIfAbsent method import java util Map import j
  • 将数组从控制器传递到视图 - Codeigniter

    我尝试在控制器中打印数组 然后将其传递给视图 这是输出 Array annunci gt Array 0 gt stdClass Object EmailDatore gt email protected Nome gt asdasd Co
  • WebSphere 7 中的 Spring 依赖注入(JSR 330 注释)不起作用

    我有一个使用 Java 6 Spring Framework 3 1 2 和 Mule ESB 3 3 0 以及与此问题无关的其他库构建的企业应用程序 我们的豆子和服务都声明为 Named and InjectJSR 330 注释 分别用于
  • 使用 Python 3 将 JSON 转换为 CSV

    我需要从 Meetup API 获取一些数据 将获取的 JSON 转换为 CSV 所有这些都在 Python 3 中进行 我从未使用过 JSON 或 Python 因此遇到了一些问题 获取数据不是问题 但我似乎无法将 JSON 对象解析为正
  • 如何在 ASP.NET MVC 中的 HttpPost 上绑定嵌套对象

    我已经开始实施这个解决方案复杂类型嵌套对象的绑定属性包含和排除属性 但它根本不起作用 同样的问题在这里在 HttpPost 上使用 MVC3 绑定嵌套模型 但没有具体答案 Model Bind Include FirstName Middl
  • 无法从“sklearn.metrics”导入名称“ConfusionMatrixDisplay”

    我收到一条错误消息 cannot import name ConfusionMatrixDisplay from sklearn metrics 当我运行以下导入代码时 from sklearn metrics import Confusi
  • 无法使用“插入”将文本发布到 MySQL

    我正在使用此查询输入前端编辑信息 2 问题 首先 输入数字可以正常工作 但不会发布文本 其次 new type1 和 new type2 是复选框 不能正确发布 query DELETE p FROM bl press as p WHERE
  • 如何在不知道实例对象类型的情况下调用泛型方法

    有了这个代码 World w new World var data GetData
  • 使用不同的包名称跨不同应用程序反/序列化 java 对象

    我想在不同的应用程序之间共享java对象 只要我在不同的项目中使用相同的包名称 它就可以正常工作 但如果我更改包名称 它就不再起作用了 我试图通过扩展来解决这个问题ObjectInputStream类并覆盖readClassDescript
  • 无法使用双击打开.jar,只能使用cmd

    我使用 Eclipse Indigo 制作了一个非常简单的程序 并将其作为可执行 jar 导出到我的桌面 如果我使用命令 java jar SayHello jar 程序就会运行 但是如果我双击桌面上的 SayHello jar 我的鼠标就
  • 无效的 mex 文件、libarmadillo、无法打开共享对象文件

    我知道有很多关于该主题的帖子 这可能是重复的 但我不这么认为 我的配置是 Matlab R2014b clang 3 4 Ubuntu 14 04 armadillo 4 600 4 我有一个本地安装的犰狳 不是系统方面的 所以包括 手动链
  • 使用 PHP 替换文本文件中的行 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个包含以下数据的文本文件 1 fjd 2 skd 3 fks 我想使用 php 替换文本文件中的一部分 例如我想这样做 找到以 开头的行2 并将其替换为 2 word 所以 2
  • 如何使用 Webdriver 在 BMC 项目中执行下拉菜单

    我无法在 BMC 项目中自动执行下拉功能 尝试了很多选择 这对我有很大帮助 请帮忙 div class df arfid913111809 ardbnCustomer Char style width 309px height 21px d
  • 是否值得将 slf4j 与 log4j2 一起使用

    我无法决定是否将 slf4j 与 log4j2 一起使用 根据在线帖子 看起来它不会对性能产生任何影响 但这确实是必需的 这些观点也有利于 log4j2 SLF4J 强制您的应用程序记录字符串 如果您想记录文本 Log4j 2 API 支持