Log4j vs logback

我们在一个自制的包装后面使用 log4j,现在我们计划使用更多的特性。

我们要更新到日志记录吗?

(我指的是框架,而不是像 SLF4J 那样的立面)

124198 次浏览

不完全回答你的问题,但是如果你可以离开你自己做的包装,那么有 SLF4J (SLf4J),Hibernate 现在已经切换到(而不是公共日志)。

SLF4J 没有类装入器问题,也没有使用 JakartaCommons 日志记录(JCL)观察到的内存泄漏。

SLF4J 支持 JDK 日志记录、 log4j 和 logback。因此,当时机合适时,从 log4j 切换到 logback 应该相当容易。

编辑: 很抱歉我没有说清楚。我建议使用 SLF4J 来隔离自己,避免在 log4j 和 logback 之间做出艰难的选择。

你的决定应该基于

  • 你对这些“更多功能”的实际需要; 以及
  • 实施变更的预期成本。

您应该抵制仅仅因为 API“更新、更亮、更好”而更改 API 的冲动我的原则是“如果没坏,就不要踢它”

如果您的应用程序需要一个非常复杂的日志框架,您可能需要考虑原因。

日志本机实现 SLF4JAPI。这意味着,如果您使用的是 logback,那么您实际上是在使用 SLF4JAPI。理论上,您可以直接使用 logback API 的内部结构来进行日志记录,但是这是非常不鼓励的。关于日志记录器的所有日志回溯文档和示例都是根据 SLF4J API 编写的。

因此,通过使用 logback,您实际上是在使用 SLF4J,而且如果出于任何原因希望切换回 log4j,只需将 SLF4J-log4j12.jar 放到类路径上,就可以在几分钟内完成切换。

当从 logback 迁移到 log4j 时,logback 的特定部分,特别是包含在 Xml配置文件中的部分仍然需要迁移到它的 log4j 等价物,即 Log4j.properties。当向另一个方向迁移时,log4j 配置(即 Log4j.properties)需要转换为其等效的 logback。有一个 在线工具在线工具的。迁移配置文件所涉及的工作量比迁移日志记录器调用所需的工作量要少,这些日志记录器调用遍布您所有软件的源代码及其依赖关系。

你应该吗? 是的

为什么? 日志4J基本上已经被 后退弃用了。

是急事吗? 也许不是。

是否无痛? 也许吧,但这可能取决于您的日志语句。

注意,如果您真的想要充分利用 LogBack (或 SLF4J) ,那么您真的需要编写 正确的日志记录语句。这将产生一些优势,比如由于延迟计算而使代码更快,以及由于可以避免保护而减少代码行数。

最后,我强烈推荐 SLF4J (为什么要用自己的外观重新创建轮子?)

恕我直言,成熟的项目,甚至深入到开发阶段的项目,从这样的升级中可能得不偿失。Logback 在点数组中当然要先进得多,但在工作系统中完全替换的程度还不够。我当然会考虑在新的开发中使用 logback,但是现有的 log4j 对于已经发布和遇到的最终用户来说已经足够好和成熟了。这是很主观的,你应该看到自己的成本。

在日志领域有 Facades (如 Apache Commons Logging,slf4j 甚至 Log4j 2.0 API)和实现(Log4j 1 + 2,java.util.log,TinyLog,Logback)。

基本上你应该用 slf4j IF 代替你自己做的包装,只有在你不满意的时候。虽然 Apache Commons Logging 实际上并没有提供现代的 API,但 slf4j 和新的 Log4j2 facade 提供了这种 API。鉴于相当多的应用程序使用 slf4j 作为包装器,使用它可能是有意义的。

Slf4j 提供了许多不错的 API 代码,如下面这个来自 slf4j 文档的例子:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

它是变量替换,Log4j2也支持这种方法。

然而,您需要知道 slf4j 是由 QOS 开发的,QOS 也维护日志记录。Log4j 2.0是在 Apache软件基金会中烘烤的。在过去的三年里,一个充满活力和活跃的社区再次在那里成长起来。如果你喜欢开放源代码,因为它是由 Apache软件基金会所做的,它保证你可以重新考虑使用 slf4j,赞成直接使用 Log4j 2。

请注意:

在过去,log4j 1不是主动维护的,而 Logback 是。但现在情况不同了。Log4j2得到了积极的维护,并按照几乎定期的时间表发布。它还包含了很多现代特性,并且比 Logback 做得更好。这有时只是一个品味的问题,你应该得出自己的结论。

我简要介绍了 Log4j 2.0的新特性: http://www.grobmeier.de/the-new-log4j-2-0-05122012.html

在阅读本文时,您将看到 Log4j2受到 Logback 的启发,也受到其他日志框架的启发。但是代码库是不同的; 它与 Log4j1几乎没有共享,与 Logback 则没有共享。这带来了一些改进,例如 Log4j2使用 bytestreams 而不是底层的 String 进行操作。而且它在重新配置时不会丢失事件。

Log4j2能够以比我所知道的其他框架更快的速度记录日志: http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html

而且用户社区似乎仍然比 Logback 大得多: http://www.grobmeier.de/apache-log4j-is-the-leading-logging-framework-06082013.html

所有这些都表明,最好的办法是选择最适合您想要实现的目标的日志框架。我不会切换一个完整的框架,如果我会禁用生产环境中的日志,只是执行基本的日志在我的应用程序。然而,如果您在日志方面做了更多的工作,那么只需看一下框架及其开发人员提供的特性即可。虽然您通过 QOS 获得了对 Logback 的商业支持(我听说) ,但是目前还没有对 Log4j 2的商业支持。另一方面,如果您需要进行审计日志记录,并且需要异步追加程序提供高性能,那么检查 log4j 2是非常有意义的。

请注意,尽管他们提供了所有的舒适,立面总是吃一点表现。它可能对你一点影响都没有,但是如果你的资源不足,你可能需要节省一切你可以拥有的。

如果不更好地了解您的需求,几乎不可能给出建议。只是: 不要因为很多人改变就改变。切换只是因为你看到了它的价值。而关于 log4j 已经死亡的论点已经不再有价值了。它是活的,而且很热。

免责声明: 我目前是副总裁,Apache 日志服务和参与 log4j 以及。