Java log4j vs logback

Java log4j vs logback,java,logging,log4j,logback,Java,Logging,Log4j,Logback,我们在自制的包装器后面使用log4j。我们计划现在使用它的更多功能 我们应该更新到logback吗 (我的意思是框架不像SLF4J那样是一个门面)并不能完全回答您的问题,但是如果您可以离开自制的包装器,那么Hibernate现在就切换到了它(而不是commons日志) SLF4J不存在Jakarta Commons Logging(JCL)中观察到的类装入器问题或内存泄漏 SLF4J支持JDK日志、log4j和logback。因此,在适当的时候,从log4j切换到logback应该相当容易 编辑

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

我们应该更新到logback吗


(我的意思是框架不像SLF4J那样是一个门面)

并不能完全回答您的问题,但是如果您可以离开自制的包装器,那么Hibernate现在就切换到了它(而不是commons日志)

SLF4J不存在Jakarta Commons Logging(JCL)中观察到的类装入器问题或内存泄漏

SLF4J支持JDK日志、log4j和logback。因此,在适当的时候,从log4j切换到logback应该相当容易


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

您的决定应该基于

  • 您对这些“更多功能”的实际需求;及
  • 您实施变更的预期成本
你应该抵制仅仅因为API“更新、闪亮、更好”而改变API的冲动。我遵循“如果它没有坏,就不要踢它”的政策


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

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

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


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

您应该这样做吗

为什么??基本上已经被反对了

有急事吗?也许不是

它无痛吗?可能吧,但这可能取决于您的日志记录语句

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


最后,我强烈推荐SLF4J。(为什么要用你自己的门面来重建轮子?

成熟的项目,甚至是深入开发阶段的项目,可能会从这种升级中损失更多,IMHO说。在一系列点中,Logback当然要先进得多,但在工作系统中,它还不能完全替代Logback。我当然会考虑重新开发一个新的开发,但是现有的Log4J对于已经发布并满足最终用户的任何东西来说已经足够成熟了。这是非常主观的,您应该看到自己的成本。

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

基本上你应该用slf4j替换你的自制包装,如果并且只有当你因为某种原因对它不满意的时候。虽然Apache Commons日志并没有真正提供现代API,但slf4j和新的Log4j 2 facade提供了这一点。鉴于相当多的应用程序使用slf4j作为包装器,使用它可能是有意义的

slf4j提供了许多漂亮的API糖,如slf4j文档中的示例:

logger.debug(“温度设置为{},旧温度为{}.”,t,oldT)

这是变量替换。log4j2也支持这一点

但是,您需要知道,slf4j是由QOS开发的,QOS还维护回登录。Log4J 2是在Apache软件基金会中烘焙的。在过去的三年里,一个充满活力和活力的社区再次在那里成长。如果你欣赏开源,因为它是由Apache软件基金会所做的所有保证,你可能会重新考虑使用SLF4J有利于直接使用Log4J 2。 请注意:

在过去,log4j 1没有被积极维护,而Logback被激活。但今天情况不同了。log4j2被积极维护,并几乎定期发布。它还包括许多现代功能,并且-imho-比Logback做得更好。这有时只是一个品味的问题,你应该得出自己的结论

我简要介绍了Log4j 2.0的新功能:

阅读本文时,您将看到log4j2的灵感来自于Logback,但也来自于其他日志框架。但是代码库是不同的;它与Log4j 1几乎不共享任何内容,而与Logback共享零。这导致了一些改进,如示例log4j2使用bytestream而不是引擎盖下的字符串进行操作。此外,它在重新配置时不会释放事件

Log4j 2可以以比我所知道的其他框架更快的速度登录:

而且用户社区似乎比logback大得多:

总之,最好的办法是选择最适合您想要实现的日志框架。如果我在生产环境中禁用日志记录,而只在我的应用程序中执行基本日志记录,我就不会切换完整的框架。但是,如果您在日志方面做得更多,只需看看框架及其开发人员提供的特性。虽然您可以通过QOS获得对Logback的商业支持(我听说),但目前还没有对Log4j 2的商业支持。另一方面,如果你需要