标签:
日志是任何项目中最重要的东西之一,特别是遇到多线程环境下高压力导致的并发bug时。但是在实际项目中有使用slf4j-api、slf4j-log4j12还有log4j的,作为程序员到底应该使用哪一种呢?要使用他们,我们首先要理清楚他们之间的关系。
1、slf4j-api、slf4j-log4j12、log4j之间的关系
①首先系统包含slf4j-api作为日志接入的接口。compile时slf4j-api中public final class LoggerFactor类中private final static void bind()方法会寻找具体的日志实现类绑定,主要通过StaticLoggerBinder.getSingleton()的语句调用。
②slf4j-log4j12是链接slf4j-api和log4j中间的适配器。它实现了slf4j-apiz中StaticLoggerBinder接口,从而使得在编译时绑定的是slf4j-log4j12的getSingleton()方法。
③log4j是具体的日志系统。通过slf4j-log4j12初始化Log4j,达到最终日志的输出。
2、什么样的日志需要记录
每次你要加一行日志的时候,你都会想,这里该用哪种日志级别?大概有90%的程序员都不太注意这个问题,都是用一个级别来记录日志,通常不是INFO就是DEBUG。为什么?日志框架和System.out相比有两大优势:分类和级别。
两者可以让你可以选择性的过滤日志,永久的或者只是在排查错误的时候。
上面的列表只是一个建议,你可以根据自己的规则来记录日志,但最好要有一定的规则。我个人的经验是:在代码层面不要进行日志过滤,而是用正确的日志级别能够快速的过滤出想要的信息,这样能节省你很多时间。最后要说的就是这个臭名昭著的is*Enabled的条件语句了。有的人喜欢把每次日志前加上这个:
if(log.isDebugEnabled()) log.debug("Place for your commercial");
个人认为,应该避免在代码里加入这个乱哄哄的东西。性能看起来没有什么提升(尤其是用了slf4j之后),更像是过早的优化。还有,没发现这么做有点多余么?很少有时候是明确需要这种显式的判断语句的,除非我们证明构造日志消息本身开销太大。
3、如何使用
未完待续。。。。。。。
标签:
原文地址:http://www.cnblogs.com/daxiang2008/p/5665020.html