是否有技术原因更喜欢使用 logback 而不是 log4j?
新项目是否应该使用 logback 而不是 log4j 作为日志记录框架?
或者换句话说:'logback是否比log4j更好(将SLF4J-logback的'功能'留在旁边)?
新项目是否应该使用 logback 而不是 log4j 作为日志记录框架?
或者换句话说:'logback是否比log4j更好(将SLF4J-logback的'功能'留在旁边)?
您应该使用 SLF4J+Logback 进行日志记录。
它提供了整洁的功能,如参数化消息和(与共享资源日志记录相反)映射的诊断上下文(MDC,javadoc,文档)。
使用SLF4J使日志记录后端能够以一种非常优雅的方式进行交换。
此外,SLF4J 支持将其他日志记录框架桥接到您将要使用的实际 SLF4J 实现,因此来自第三方软件的日志记录事件将显示在统一日志中 - java.util.logging 除外,它不能像其他日志记录框架那样桥接。
桥接 jul 在 SLF4JBridgeHandler 的 javadocs 中进行了解释。
我在几个项目中使用SLF4J + Logback组合的经验非常好,LOG4J开发几乎停滞不前。
SLF4J具有以下缺点:
作者(Logback和Log4j的作者)列出了 http://logback.qos.ch/reasonsToSwitch.html 更改的原因。
这里有一些让我印象深刻;
更快的实施
根据我们之前在log4j上的工作,logback内部已经被重写,在某些关键执行路径上执行速度提高了十倍。logback组件不仅速度更快,而且内存占用量也更小。
自动重新加载配置文件
Logback-classic可以在修改时自动重新加载其配置文件。扫描过程既快速又安全,因为它不涉及创建单独的扫描线程。这种技术上的微妙之处确保了日志在应用程序服务器中以及更普遍的JEE环境中都能很好地运行。
使用打包数据堆叠跟踪
当 logback 打印异常时,堆栈跟踪将包括打包数据。下面是由 logback-demo Web 应用程序生成的示例堆栈跟踪。
14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 不是有效值 java.lang.Exception: 99
在 ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java:28) [classes/:na] at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) [struts-1.2.9.jar:1.2.9] at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236) [struts-1.2.9.jar:1.2.9] atorg.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432) [struts-1.2.9.jar:1.2.9] at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) [servlet-api-2.5-6.1.12.jar:6.1.12]
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502) [jetty-6.1.12.jar:6.1.12] at ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44) [classes/:na] at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1115) [jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:361) [jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.webapp.WebApptext.handle(WebAppContext.java:417) [jetty-6.1.12.jar:6.1.12] at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230) [jetty-6.1.12.jar:6.1.12]
从上面,您可以识别出该应用程序使用的是 Struts 版本 1.2.9,并且是在 jetty 版本 6.1.12 下部署的。因此,堆栈跟踪将快速通知读者异常中的类,以及它们所属的包和包版本。当您的客户向您发送堆栈跟踪时,作为开发人员,您将不再需要要求他们向您发送有关他们正在使用的软件包版本的信息。该信息将成为堆栈跟踪的一部分。有关详细信息,请参阅“%x可清除”转换词。
此功能非常有用,以至于某些用户错误地将其视为其 IDE 的一项功能。
自动删除旧的日志存档
通过设置TimeBasedRollingPolicy或SizeAndTimeBasedFNATP的maxHistory属性,您可以控制存档文件的最大数量。如果您的滚动策略要求每月展期,并且您希望保留一年的日志,只需将 maxHistory 属性设置为 12。超过 12 个月的已存档日志文件将自动删除。
那里可能存在偏见,但同一个人确实写了这两个框架,如果他说使用Logback over Log4j,他可能值得一听。