1. 日志接口常用的有commons-logging和slf4j, 日志实现常用的有log4j和logback。那么, 我们应该选取什么样的组合呢?
2. Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块: logback-core, logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个改良版本。此外logback-classic完整实现slf4j api使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。
3. logback与Log4J的比较
3.1. 更快的实现: Logback的内核重写了, 在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了, 初始化内存加载也更小了。
3.2. Logback-classic完整实现了slf4j api: logback-classic完整实现slf4j api, 在使用slf4j中, 你都感觉不到logback-classic。因为logback-classic非常自然地实现了slf4j, 所以切换到log4j或者其他日志系统, 非常容易, 只需要提供成另一个jar包就OK, 根本不需要去动那些通过slf4j api实现的代码。
3.3. 自动重载配置文件: 当配置文件修改了, Logback-classic能自动重新加载配置文件。扫描过程快且安全, 它并不需要另外创建一个扫描线程。
3.4. 安全模式和友好恢复: 在谨慎模式下, 多个FileAppender实例跑在JVM下, 能够安全地写同一个日志文件。Logback的FileAppender和它的子类包括RollingFileAppender能够非常友好地从I/O异常中恢复。
3.5. 配置文件可以处理不同的情况: 开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发, 测试, 生产)。而这些配置文件仅仅只有一些很小的不同, 就可以实现, 这样一个配置文件就可以适应多个环境。
3.6. Filters(过滤器): 有些时候, 需要诊断一个问题, 需要打出日志。在log4j, 只有降低日志级别, 不过这样会打出大量的日志, 会影响应用性能。在Logback, 你可以继续保持那个日志级别而除掉某种特殊情况, 如alice这个用户登录, 她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别, 要实现这个功能只需加4行XML配置。
3.7. SiftingAppender(一个多功能的Appender): 它可以用来分割日志文件根据任何一个给定的运行参数。如SiftingAppender能够区别日志事件跟进用户的Session, 然后每个用户会有一个日志文件。
3.8. 自动压缩log日志: RollingFileAppender在产生新文件的时候, 会自动压缩已经打出来的日志文件。压缩是个异步过程, 所以甚至对于大的日志文件, 在压缩过程中应用不会受任何影响。
3.9. 自动去除旧日志: 通过设置SizeAndTimeBasedRollingPolicy或者TimeBasedRollingPolicy的maxHistory属性, 你可以控制已经产生日志文件的最大数量。如果设置maxHistory为12, 那那些log文件超过12个月的都会被自动移除。
4. 当年Apache说服log4j以及其他的日志来按照commons-logging的标准编写, 但是由于commons-logging的类加载有点问题, 实现起来也不友好, 于是乎就用有人创作了slf4j, 也因此而与commons-logging两分天下。更加推荐slf4j+logback的组合。