Logback旨在作为流行的log4j项目的继任者,从log4j1.x的遗留部分开始。
Logback的体系结构非常通用,可以在不同的情况下应用。目前,logback分为三个模块,logback核心、logback经典和logback访问。
logback核心模块为其他两个模块奠定了基础。logback-classic模块可以被同化为log4j1.x的显著改进版本。此外,logback-cclassic本机实现了SLF4J API,因此您可以很容易地在logback和其他日志框架(如log4j1.x或java.util.logging(JUL))之间来回切换。
logback访问模块与Servlet容器(如Tomcat和Jetty)集成,以提供HTTP访问日志功能。请注意,您可以很容易地在logback核心之上构建自己的模块。
Logback在log4j 1.x的基础上带来了大量大大小小的改进。这些改进实在太多了以至于无法一一列举。尽管如此,这里还是列出了一些从log4j 1.x切换到logback的原因。请记住,logback在概念上与log4j 1.x非常相似,因为这两个项目都是由同一开发者创建的。如果您已经熟悉log4j 1.x,那么使用logback您会很快感到宾至如归。
1. 执行更快
基于我们之前在log4j 1.x上的工作,logback内部已经被重新编写,在某些关键执行路径上的执行速度大约快十倍。logback组件不仅速度更快,而且占用的内存也更小。
2. 大量的测试
Logback提供了一系列经过几年和无数小时的工作开发的测试。虽然log4j1.x也进行了测试,但logback将测试提升到了一个完全不同的级别。在我们看来,这是喜欢logback而不是log4j 1.x的唯一最重要的原因。即使在不利的条件下,您也希望您的日志框架坚如磐石,可靠。
3. logback经典版以SLF4J为母语
由于logback classic中的Logger类以本机方式实现SLF4J API,因此在调用以logback classical作为底层实现的SLF4J记录器时不会产生任何开销。此外,由于logback classic强烈鼓励使用SLF4J作为其客户端API,因此如果您需要切换到log4j 1.x或j.u.l.,可以通过用另一个jar文件替换一个来实现。您将不需要通过SLF4J API进行代码日志记录。这可以大大减少切换日志框架所涉及的工作。
4. 大量的文档
Logback提供了详细且不断更新的文档。
5. 自动的重新加载配置文件
Logback classic可以在修改后自动重新加载其配置文件。扫描过程快速、无争用,并且可以动态扩展到每秒数百万次调用,分布在数百个线程上。它在应用程序服务器中以及更普遍的JEE环境中也能很好地发挥作用,因为它不需要创建单独的扫描线程。
6. 从I/O故障中优雅地恢复
Logback的FileAppender及其所有子类,包括RollingFileAppenders,可以从I/O故障中正常恢复。因此,如果文件服务器暂时出现故障,您就不再需要重新启动应用程序来恢复日志记录。一旦文件服务器恢复正常,相关的logback appender将透明且快速地从以前的错误情况中恢复。
7. 自动删除旧日志存档
通过设置TimeBasedRollingPolicy或SizeAndTimeBasedFNATP的maxHistory属性,可以控制存档文件的最大数量。如果您的滚动策略要求每月滚动,并且您希望保留一年的日志,只需将maxHistory属性设置为12即可。超过12个月的存档日志文件将被自动删除。
8. 自动压缩存档的日志文件
RollingFileAppender可以在滚动期间自动压缩存档的日志文件。压缩总是异步进行,这样即使对于大型日志文件,在压缩期间也不会阻止应用程序。
9. 谨慎模式
在谨慎模式下,在多个JVM上运行的多个FileAppender实例可以安全地写入同一日志文件。由于某些限制,谨慎模式扩展到RollingFileAppender。
10. 配置文件的条件处理
开发人员经常需要在针对不同环境(如开发、测试和生产)的几个logback配置文件之间进行切换。这些配置文件有很多共同之处,只是在少数地方有所不同。为了避免重复,logback支持在、和元素的帮助下对配置文件进行条件处理,以便单个配置文件可以充分针对多个环境。
11. 过滤器
Logback提供了一系列广泛的过滤功能,比log4j 1.x所能提供的功能更进一步。例如,让我们假设您在生产服务器上部署了一个关键业务应用程序。考虑到处理的事务量很大,日志记录级别设置为WARN,因此只记录警告和错误。现在想象一下,您遇到的一个bug可以在生产系统上重现,但由于这两个环境(生产/测试)之间的未指明差异,在测试平台上仍然难以找到。
对于log4j 1.x,您唯一的选择是将生产系统上的日志记录级别降低到DEBUG,以尝试识别问题。不幸的是,这将生成大量的日志数据,使分析变得困难。更重要的是,大量的日志记录会影响应用程序在生产系统上的性能。
使用logback,您可以选择将除一个用户之外的所有用户的日志记录保持在WARN级别,负责识别问题的Alice说。当Alice登录时,她将以DEBUG级别登录,而其他用户可以继续以WARN级别登录。这一特性可以通过在配置文件中添加4行XML来实现。在手册的相关章节中搜索MDCFilter。
12. 可进行筛选的追加器
SiftingAppender是一款功能强大的追加器。它可以用于根据任何给定的运行时属性来分离(或筛选)日志记录。例如,SiftingAppender可以根据用户会话分离日志事件,这样每个用户生成的日志就可以进入不同的日志文件,每个用户一个日志文件。
13. 包含包信息的堆栈跟踪
当logback打印异常时,堆栈跟踪将包括(依赖)包的信息。以下是logback演示web应用程序生成的示例堆栈跟踪。
14:28:48.835 [btpool0-7] INFO c.q.l.demo.prime.PrimeAction - 99 is not a valid value
java.lang.Exception: 99 is invalid
at 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]
at org.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.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的一个功能。
14. Logback访问,即:智慧的HTTP访问日志,是Logback不可或缺的一部分
最后但同样重要的是,作为logback分发的一部分,logback访问模块与Servlet容器(如Jetty或Tomcat)集成,以提供丰富而强大的HTTP访问日志功能。由于logback访问是最初设计的一部分,所以您喜欢的所有logback经典功能都可以在logback访问中使用。
总结
我们已经列出了许多倾向于logback而不是log4j 1.x的原因。考虑到logback建立在我们之前关于log4j 1.x的工作的基础上,简单地说,logback只是一个更好的log4j 1.x。
参考:Logback官网