-
Notifications
You must be signed in to change notification settings - Fork 0
##Overview Slf4j已经成为Logger的事实标准API, 它只是一个外壳,而与Commons-Logging比,最突出的一点是大部分情况下它不需要写类似下面的代码。
if(logger.isInfoEnabled()){
logger.info("hello " + name);
}
而后面的实现方面,java.util.logging, log4j 和 logback 一个比一个强。其中logback是log4j作者觉得log4j已经太烂不想再改了,重新写的一个实现。但logback一来是强制使用xml格式的配置文件,没有log4j.properties的简洁,而来很奇怪的过了这么久依然没多少人用,因此依然使用log4j。
最近Jboss也出来一个logging库,而且在hibernate4.1里用上了,不知何意。底层的东西,还是不要太多选择的好。
##Slf4j## slf4j只是一个日志外壳,需要你加入slf4j-jdk14.jar, slf4j-log4j12.jar或logback.jar,将日志调用转发到实际的日志框架。在classpath中有哪个jar包,slf4j就会选择哪个实现。如果错误的同时存在多个jar包,用哪个那就看运气了。
有些第三方的工具包,已经直接使用了log4j, common-logging 或 java.util.logging。如果我们最后决定使用log4j做最终输出,则需要放一个jcl104-over-slf4j.jar和 jul-to-slf4j.jar来假装成common-logging和java.util.logging的api,将日志请求转发给slf4j,slf4j再转发给log4j,此时还需要保证,classpath里没有正牌的common-logging.jar。 而原本直接使用log4j的就不需要做任何改动。
slf4j的api不需要写isWarnEnable(),是因为原来common-logging的API,早早就进行了一次字符串拼接,如果不需要打印就白白浪费了时间。而slf4j的代码如下,只在真正需要打印的时候才进行拼接。
logger.info("Hello {}", name);
注意如果参数本身的获取就需要消耗大量的时间,就依然需要用isXXEnable()把代码段圈起来。
if(logger.isInfoEnabled()){
logger.info("hello " + userDao.get(id).getName);
}
##Log4j##
###Log4jMockAppender###
对日志输出的测试一向是头痛的事情,在log4j下,可以扩展一个Appender出来,使用一个List将所有log记录下来,并提供相应的获取,校验API。
springside test中封装了一个Log4jMockAppender , 同样原理也可以为logback或java.util.logging编写相应的appender。
典型的场景如下:
//add the mock appender to logger
Log4jMockAppender appender = new Log4jMockAppender();
appender.addToLogger(AdvancedNotifyMessageListener.class);
.....invoke some business code
assertEquals("hello", appender.getFirstMessage());
###Log4jManager### 很多项目都有临时调整logger级别的需求,springside-extensions中的Log4jManager实现了相应的需求。 Log4jManager已被Spring JMX注释成为MBean,可以使用JConsole或Restful API远程访问,。 但还有很多项目是直接提供一个页面进行相关设置。
在showcase中,就演示了log4j的控制页面,调用Log4jManager进行处理。
###Log4j资料### 依然是那本叫《The complete log4j manual》的电子书。