log4j vs logback

我们使用自制包装器后面的log4j。 我们现在计划使用更多的function。

我们应该更新到logback?

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

Logback本地实现了SLF4J API。 这意味着如果你使用的是logback,你实际上是在使用SLF4J API。 您理论上可以直接使用logback API的内部进行日志logging,但是非常沮丧。 logging器上的所有logback文档和示例都是根据SLF4J API编写的。

所以通过使用logback,你实际上会使用SLF4J,如果因为某种原因想要切换回log4j,只需简单地把slf4j-log4j12.jar放到你的类path上,你可以在几分钟内完成。

从logback迁移到log4j时,logback特定部分(特别是logback.xmlconfiguration文件中包含的那些部分)仍然需要迁移到log4j等价物(即log4j.properties) 。 在另一个方向迁移时,需要将log4jconfiguration(即log4j.properties)转换为其等同的logback。 有一个在线工具 。 迁移configuration文件所涉及的工作量远远less于将所有软件的源代码及其依赖关系中传播的logging器调用所需的工作量。

你应该? 是的

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

紧急吗? 也许不会。

它是无痛的吗? 可能,但它可能取决于你的日志报表。

请注意,如果您真的想充分利用LogBack(或SLF4J),那么您确实需要编写正确的日志logging语句 。 这会产生像更快的代码,因为懒惰的评估和更less的代码行,因为你可以避免警卫的优势。

最后,我强烈推荐SLF4J。 (为什么用自己的门面重新创build车轮?)

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

基本上你应该用slf4j IFreplace你的自制包装,只有在你不满意的情况下才会出于某种原因。 虽然Apache Commons Logging实际上并不提供现代API,但slf4j和新的Log4j 2外观正在提供这一function。 鉴于相当多的应用程序使用slf4j作为包装,使用它可能是有意义的。

slf4j给出了一些不错的API糖,就像slf4j文档中的这个例子:

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

这是variables替代。 这也受Log4j 2的支持。

但是你需要知道,slf4j是由QOS开发的,他们也维护着logback。 Log4j 2.0在Apache软件基金会中出炉。 在过去的三年里,一个充满活力和活跃的社区再次在那里成长。 如果您赞赏开放源代码,因为Apache软件基金会提供了所有的保证,您可能会重新考虑使用slf4j而直接使用Log4j 2。

请注意:

在过去log4j 1没有积极维护而Logback是。 但是今天事情是不一样的。 Log4j 2正在积极维护和几乎定期发布。 它还包括许多现代function和-imho-使得一些事情比Logback更好。 这有时只是一个品味的问题,你应该得出自己的结论。

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

在阅读时你会看到Log4j 2受到了Logback的启发,也受到了其他日志框架的启发。 但是代码库是不同的; 它与Log4j 1几乎没有共享,Logback与零共享。 这导致了一些改进,如示例Log4j 2在字面stream而不是string下操作。 另外它在重新configuration时不会松动事件。

Log4j 2可以以比我知道的其他框架更高的速度进行logging: 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

所有人都说最好的主意是你select了最适合你想要达到的日志框架。 我不会切换一个完整的框架,如果我禁用生产环境中的日志logging,只是在我的应用程序中执行基本的日志logging 但是,如果你做更多的日志logging,只要看看框架和他们的开发人员提供的function。 虽然通过QOS获得对Logback的商业支持(我听说)目前Log4j 2没有任何商业支持。另一方面,如果您需要进行审计日志logging,并需要asynchronousappender提供的高性能,那么这对于Log4j 2来说是非常有意义的检查log4j 2。

请注意,尽pipe他们提供的所有舒适,外墙总是吃一点表演。 这可能不会影响到你,但是如果你的资源不足,你可能需要保存所有的东西。

不知道你的要求更好,几乎不可能提出build议。 只是:不要因为很多人切换就切换。 切换只是因为你看到它的价值。 而log4j已经死亡的论证不再计算在内。 它还活着,而且很热。

免责声明:我目前是VP,Apache Logging Services和log4j。

不完全回答你的问题,但是如果你可以离开你的自制包装,那么现在有一个Hibernate现在已经切换到Java的简单日志门面(SLF4J) (而不是常见的日志logging)。

使用Jakarta Commons Logging(JCL)时,SLF4J没有遇到任何类加载器问题或内存泄漏。

SLF4J支持JDK日志logging,log4j和logback。 那么当时间正确时,从log4j切换到logback应该相当容易。

编辑:Aplogies,我没有让自己清楚。 我build议使用SLF4J来隔离你在log4j或logback之间做出艰难的select。

你的决定应该基于

  • 您对这些“更多function”的实际需求; 和
  • 您实施变更的预期成本。

您应该抵制改变API的冲动,因为它“更新,更shiny,更好”。 我遵循“如果不坏,不要踢”的政策。

如果你的应用程序需要一个非常复杂的日志框架,你可能要考虑为什么。

恕我直言,成熟的项目,甚至是深入开发阶段的项目,可能会比此类升级带来更多的收益。 Logback在一系列的要点当然要高得多,但在一个工作系统中不能完全替代。 我肯定会考虑一个新的开发logback,但现有的log4j已经足够成熟,已经发布和满足最终用户的任何东西。 这是非常主观的,你应该看看花费你自己。