是否有技术原因使用 logback 而不是 log4j?

新项目应该使用 logback 而不是 log4j 作为日志框架吗?

或者换句话说: ‘ logback 比 log4j 更好吗(把 SLF4J-logback 的‘功能’留在旁边) ?’

18884 次浏览

我不熟悉 SLF4J,我只是简单地看了一下 logback,但是我想到了两件事。

首先,你为什么要把工具排除在考试之外?我认为保持一个开放的心态和审视所有的可能性来选择最好的是很重要的。

其次,我认为在一些项目中,一个工具比另一个工具更好,而在另一个项目中,情况可能恰恰相反。我不认为一个工具总是比另一个工具好。毕竟有 没有灵丹妙药

回答你的问题,是也不是。这取决于项目,以及团队对一个工具的熟悉程度。如果整个团队对 log4j 非常满意,那么我不会说“不要使用 log4j”,因为它满足了所有的需求,而 logback 并没有提供任何我们完成任务所需要的东西。

最初的 log4j 和 logback 是由同一个人设计和实现的。

一些开源工具已经使用了 SLF4J。我没有看到这个工具有任何明显的缺陷。因此,除非您的代码库中有很多 log4j 的扩展,否则我将继续使用 logback。

我认为您的决定应该归结为如果您决定使用 log4j 或 JakartaCommons Logging-您是否正在开发一个将包含在其他应用程序中的库?如果是这样,那么强迫库的用户也使用您选择的日志库似乎是不公平的。

如果答案是否定的,我会选择更简单的添加方式和你更喜欢的方式。听起来 logback 和 log4j 一样具有可扩展性和可靠性,所以如果您喜欢使用它,请继续。

我将在所有情况下使用 slf4j 进行日志记录。这允许您在部署时而不是代码时选择要使用的实际日志后端。

这对我来说很有价值。它允许我在旧的 JVM 中使用 log4j,在1.5 + JVM 中使用 logback,如果需要还可以使用 java.util.log。

您应该使用 SLF4J + Logback 进行日志记录。

它提供了诸如参数化消息和映射诊断上下文(MDC、 Javadoc文件)之类的简洁特性(与公共日志记录相反)。

使用 SLF4J 使得日志后端可以以一种非常优雅的方式进行交换。

此外,其他日志框架的 SLF4J 支撑桥梁到您将要使用的实际 SLF4J 实现,因此来自第三方软件的日志事件将显示在您的统一日志中——除了 java.util.log 不能像其他日志框架那样进行桥接。

在 SLF4JBridgeHandler 的 Javadocs中解释了桥接 jul。

我在几个项目中使用 SLF4J + Logback 组合获得了非常好的经验,LOG4J 的开发几乎停滞不前。

SLF4J 还有以下缺点:

  • 它不支持 varargs 与 Java < 1.5保持兼容
  • 它不支持同时使用参数化消息和异常。
  • 它不包含 LOG4J 所具有的对嵌套诊断上下文(NDC,Javadoc)的支持。

返回更多关于 JavaEE 的信息:
一般来说(从代码到文档)它记住容器——多个应用程序如何共存,类装入器如何实现等等。包括日志记录器、 JNDI、 JMX 配置等的上下文。

Logback 补充称,来自开发商的预期几乎相同 参数化日志记录(不需要使用 if (logger.isDebugEnable ())来避免字符串串联开销)

Log4j-只有巨大的加号是旧的 JVM 支持,小(IMO) 一些扩展,例如,我为 configureAndWatch 为 Log4j 编写了扩展,但 Logback 没有这样的东西

作者(Logback 和 Log4j 的作者)列出了在 http://logback.qos.ch/reasonsToSwitch.html更改的理由。

这里有一些让我印象深刻的;

  • 更快的实现

    根据我们之前对 log4j 的研究, 日志回溯内部已经 重写了大约十次 在某些关键执行上更快 路径。不仅是日志 组件速度更快,它们有一个 内存占用也更小

  • 自动重新加载配置 文件

    经典的日志可以自动 重新加载其配置文件 扫描过程是 既快又安全 涉及创建一个独立的 扫描线。这种技术 微妙的设计确保了后退操作的正确性 在应用服务器和 更一般地在 JEE 内 环境

  • 包装数据的堆栈跟踪

    当日志回输出异常时, 堆栈跟踪将包括打包 下面是一个示例堆栈跟踪 由 logback-demo 生成 网上应用程式。

    14:28:48.835[ btpool0-7] INFO Cq.l.demo.Prime PrimeAction-99是 不是有效值 例外: 99无效
    在 Prime. PrimeAction.execute (PrimeAction.java: 28) [班级/: na ]在 Action. RequestProcessor.processActionPerform (RequestProcessor.java: 431) [ struts-1.2.9. jar: 1.2.9] at Action. RequestProcessor.process (RequestProcessor.java: 236) [ struts-1.2.9. jar: 1.2.9] at Action. ActionServlet.doPost (ActionServlet.java: 432) [ struts-1.2.9. jar: 1.2.9] at 服务(HttpServlet.java: 820) [ servlet-api-2.5-6.1.12. jar: 6.1.12]
    在 Servlet. ServletHolder.handle (ServletHolder.java: 502) [ Jetty-6.1.12. jar: 6.1.12] at Demo. UserServletFilter.doFilter (UserServletFilter.java: 44) [班级/: na ]在 ServletHandler $CachedChain.doFilter (ServletHandler.java: 1115) [ Jetty-6.1.12. jar: 6.1.12] at Servlet. ServletHandler.handle (ServletHandler.java: 361) [ Jetty-6.1.12. jar: 6.1.12] at Webapp. WebAppContext.handle (WebAppContext.java: 417) [ Jetty-6.1.12. jar: 6.1.12] at Handler. ContextHandlerCollection.handle (ContextHandlerCollection.java: 230) [ Jetty-6.1.12. jar: 6.1.12]

    从上面,你可以认出 应用程序正在使用 Struts 1.2.9版本,并根据 Jetty 版本6.1.12。因此,堆栈 痕迹会很快通知读者 关于班级倒置的问题 例外,但也包和 它们所属的软件包版本 你的顾客给你寄了一堆 Trace,作为一个开发者你不会 需要更长的时间让他们送你 版本的资料 他们正在使用的软件包 信息将成为堆栈的一部分 请参见“% xThrowable”转换 一字不漏。

    这个特性对 一些用户错误地 把它当作他们 IDE 的一个特性

  • 旧日志档案的自动删除

    通过设置 基于时间的滚动策略或 SizeAndTimeBasedFNATP,你可以 控制... ... 的最大数量 存档文件。如果你的滚动 政策要求每月转期及 你希望保留一年的 Log,只需设置 maxHistory 属性设置为12。归档的日志文件 超过12个月的 自动删除

这里可能存在偏见,但是同一个人确实编写了这两个框架,如果他说使用 Logback 而不是 Log4j,那么他可能值得一听。