SLF4J+logBack 代替 Log4j
Ceki Gülcü创造了日志领域界著名的Log4J,现在又实现一个“简单的日志前端接口(Facade)”- SLF4J,和一个“可靠、通用、快速而又灵活的Java日志框架”- LOGBack。作为日志领域中的新秀,已经有种颠覆领域的趋势了。
SLF4J(Simple Logging Facade for Java)作为commons-logging的替代,为各种logging APIs提供了一个简单的统一接口,使得最终用户能够在部署的时候配置所希望的logging APIs的实现。
SLF4J会根据classpath中所存在的适配器的jar来决定将使用的日志实现库。
若需要将使用了其它logging APIs的第三方类库或已有代码的日志调用迁移到SLF4J,需要替换下面的jar:
jcl-over-slf4j.jar
替换apache commons logging。
log4j-over-slf4j.jar
替换log4j。原有的log4j.properites将失效,需要转换为logback.xml,logback网站上有提供转换器:http://logback.qos.ch/translator/。
jul-to-slf4j.jar
替换jdk logging。需要在程序开始时调用SLF4JBridgeHandler.install()来注册listener。
SLF4J支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“current user is: {}”, user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。同时,日志中的参数若超过三个,则需要将参数以数组的形式传入,如:
Object[] params = {value1, value2, value3};
logger.debug(“first value: {}, second value: {} and third value: {}.”, params);
现在Hibernate、Jetty、Spring-OSGi、Wicket和MINA等项目都已经迁移到了SLF4J,由此可见SLF4J的影响力不可忽视。
LogBack将作为Log4j的替代,和slf4j组成新的日志系统的完整实现。LogBack分为三个模块:logback-core、logback-classic和logback-access。logback-core是其它两个模块的基础;logback-classic是log4j的一个改良版本; logback-access与Servlet容器集成提供通过Http来访问日志的功能。
LogBack声称具有极佳的性能:
“某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。LogBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。
对于一般的系统,个人感觉迁移到SLF4J的必要性不是很大,如果是开发公用类库的话,就很有必要了,而且SLF4J解决了classloader的问题也是个很大的优势。Log是导致程序性能下降的一个问题,LogBack的优化使性能有了很大的提升,如果你的程序遇到了瓶颈,需要全面进行优化的时候,LogBack不失为一个好的选择。是否需要迁移,可从多方面进行考量