新项目是否应使用logback而不是log4j作为日志记录框架?
或者换句话说:'logback是否比log4j好(留下SLF4J -'feature'的logback旁边)?'
您应该使用SLF4J + Logback进行日志记录.
它提供了一些简洁的功能,如参数化消息和(与公共日志记录相比)映射诊断上下文(MDC,javadoc,文档).
使用SLF4J使得日志后端可以以非常优雅的方式进行交换.
此外,SLF4J 支持将其他日志框架桥接到您将使用的实际SLF4J实现,因此来自第三方软件的日志记录事件将显示在您的统一日志中 - 除了无法桥接的java.util.logging之外与其他日志框架相同的方式.
在SLF4JBridgeHandler 的javadocs中解释了桥接jul .
我在几个项目中使用SLF4J + Logback组合获得了非常好的经验,而LOG4J开发几乎停滞不前.
SLF4J还有以下缺点:
它不支持varargs与Java <1.5保持兼容
它不支持同时使用参数化消息和异常.
它不包含对LOG4J具有的嵌套诊断上下文(NDC,javadoc)的支持.
作者(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 cqldemo.prime.PrimeAction - 99不是有效值java.lang.Exception:99
在ch.qos.logback.demo.prime.PrimeAction.execute(PrimeAction.java )无效:org.apache.struts.action中的org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)[struts-1.2.9.jar:1.2.9]的[classes /:na]. RequestProcessor.process(RequestProcessor.java:236)[struts-1.2.9.jar:1.2.9] at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)[struts-1.2.9.jar :1.2.9]
在org.mortbay.jetty.servlet.ServletHolder的javax.servlet.http.HttpServlet.service(HttpServlet.java:820)[servlet-api-2.5-6.1.12.jar:6.1.12] . handle(ServletHolder.java:502)[jetty-6.1.12.jar:6.1.12]位于org.mortbay的ch.qos.logback.demo.UserServletFilter.doFilter(UserServletFilter.java:44)[classes /:na] .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] org.mortbay.jetty.webapp.WebAppContext.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下部署.因此,堆栈跟踪将快速通知读者有关异常中的类以及它们所属的包和包版本.当您的客户向您发送堆栈跟踪时,作为开发人员,您将不再需要让他们向您发送有关他们正在使用的软件包版本的信息.该信息将成为堆栈跟踪的一部分.有关详细信息,请参阅"%xThrowable"转换字.
这个功能非常有用,因为有些用户错误地认为它是IDE的一个功能.
自动删除旧的日志存档
通过设置TimeBasedRollingPolicy或SizeAndTimeBasedFNATP的maxHistory属性,可以控制最大归档文件数.如果您的滚动策略要求每月滚动并且您希望保留一年的日志,只需将maxHistory属性设置为12.将自动删除超过12个月的存档日志文件.
那里可能存在偏见,但同一个人确实编写了两个框架,如果他说使用Logback over Log4j,他可能值得一听.
我会使用slf4j记录所有情况.这允许您在部署时而不是代码时选择要使用的实际日志记录后端.
事实证明这对我来说非常有价值.它允许我在旧的JVM中使用log4j,并在1.5+ JVM中使用logback,如果需要也可以使用java.util.logging.