log4j vs logback

148 java logging log4j logback

我们在自制包装器后面使用log4j.我们现在计划使用它的更多功能.

我们应该更新到logback吗?

(我的意思是框架不是像SLF4J那样的外观)

Cek*_*eki 183

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

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

从logback迁移到log4j时,仍需要将logback特定部分(特别是logback.xml配置文件中包含的部分)迁移到其log4j等效部分,即log4j.properties.在向另一个方向迁移时,需要将log4j配置(即log4j.properties)转换为其等效的logback.有一个在线工具.迁移配置文件所涉及的工作量远远少于迁移所有软件源代码及其依赖项中传播的记录器调用所需的工作量.

  • 它是与这样一个广受欢迎的软件的开发者交谈的机会.谢谢Ceki for log4j. (26认同)
  • 免责声明:这个人是Log4j,SLF4J和Logback的所有原始开发者。但是对于Log4j不再起作用。 (2认同)

AWh*_*ord 54

你应该? 是的.

为什么? Log4J基本上已被Logback弃用.

紧急吗?也许不吧.

它没痛吗?可能,但它可能取决于您的日志记录.

请注意,如果您真的想要充分利用LogBack(或SLF4J),那么您确实需要编写正确的日志记录语句.由于懒惰的评估,这将产生诸如更快的代码之类的优势,并且因为可以避免保护而减少代码行数.

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

  • 注意:log4j项目不考虑不推荐使用log4j. (47认同)
  • 应澄清术语; 毫不含糊地,[log4j项目的作者](http://en.wikipedia.org/wiki/Log4j)认为[logback是log4j的继承者](http://logback.qos.ch/).这是两个项目的同一作者,所以他的意见应该有所重要; "log4j项目"本身并没有真正"考虑"任何东西.与log4j相关的当前群体有不同的意见(一些人实际上同意,一些不出意料地不同意).有了更多的历史(在原评论之后3年),SLF4J + Logback确实继续在Log4j上取得进展. (16认同)
  • 那么,对于你们所有人来说,争夺这个或那个日志库是什么呢?我们为什么要杀死/推广图书馆?至少提供一些理性的推理为什么一个比另一个好.上帝,Stack Overflow是一团糟. (3认同)

Chr*_*ian 44

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

基本上你应该用slf4j IF替换你的自制包装器,并且只有在你因某些原因不满意的情况下.虽然Apache Commons Logging并没有真正提供现代API,但slf4j和新的Log4j 2外观提供了这一点.鉴于相当多的应用程序使用slf4j作为包装器,使用它可能是有意义的.

slf4j提供了许多不错的API糖,比如来自slf4j docs的这个例子:

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

这是变量替代.Log4j 2也支持这一点.

但是你需要知道slf4j是由QOS开发的,它也维护着logback.Log4j 2.0在Apache Software Foundation中出现.在过去三年中,一个充满活力和活跃的社区再次在那里成长.如果您喜欢Apache软件基金会完成的开源,并且您可能会重新考虑使用slf4j来支持直接使用Log4j 2.

请注意:

在过去,log4j 1没有主动维护.但今天情况有所不同.Log4j 2被主动维护并几乎定期发布.它还包括许多现代功能和-imho-使一些事情比Logback更好.这有时只是一个品味问题,你应该得出自己的结论.

我写了一篇关于Log4j 2.0新功能的快速概述:http://www.grobmeier.de/the-new-log4j-2-0-05122012.html

在阅读时,您将看到Log4j 2受Logback的启发,但也受到其他日志框架的启发.但代码库是不同的; 它与Log4j 1几乎没有任何关系,而Logback则为零.这导致一些改进,例如Log4j 2使用字节流而不是字符串下的字符串.此外,重新配置时不会丢失事件.

Log4j的2可以登录比其他框架更高的速度,我知道:http://www.grobmeier.de/log4j-2-performance-close-to-insane-20072013.html

而且还是用户群体似乎比Logbacks大得多:http://www.grobmeier.de/apache-log4j-is-the-leading-logging-framework-06082013.html

所有人都表示最好的想法是选择最适合您想要实现的日志框架.如果我禁用生产环境中的日志记录并且只是在我的应用程序中执行基本日志记录,我就不会切换完整的框架.但是,如果您在日志记录方面做得更多,只需查看框架及其开发人员提供的功能.当你通过QOS得到的logback商业支持(我听说的)还有是目前的Log4j 2.没有商业支持.另一方面,如果你需要做的审计日志,需要通过异步提供高性能的appender它使一个很大的意义检查log4j 2.

请注意,尽管他们提供了所有的舒适,外墙总是吃一点性能.它可能根本不会影响你,但如果你的资源很少,你可能需要保存你可以拥有的一切.

如果不能更好地了解您的要求,几乎不可能提出建议.只是:不要因为很多人切换而切换.切换只是因为你看到了它的价值.并且log4j已经死亡的论证不再计算了.它还活着,很热.

免责声明:我目前是Apache Logging Services的副总裁,也参与了log4j.


too*_*kit 19

不完全回答你的问题,但是如果你可以离开自制的包装器,那么就会有Hibernate现在切换到的简单日志外观(SLF4J)(而不是公共日志记录).

SLF4J没有遇到使用Jakarta Commons Logging(JCL)观察到的类加载器问题或内存泄漏.

SLF4J支持JDK日志记录,log4j和logback.那么当时机成熟时,从log4j切换到logback应该相当容易.

编辑:我没有说清楚的Aplogies.我建议使用SLF4J来隔离你自己在log4j或logback之间做出艰难的选择.

  • 道歉.我的建议是,如果你使用SLF4J而不是自己的自定义外观,那么从log4j切换到logback将不那么痛苦? (4认同)
  • 我知道SLF4J.但我要求的是日志框架不是为了立面! (3认同)

Car*_*icz 13

你的决定应该基于

  • 你对这些"更多功能"的实际需求; 和
  • 您实施变更的预期成本.

你应该抵制改变API的冲动只是因为它"更新,更光亮,更好".我遵循"如果没有破坏,不要踢它"的政策.

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