日志是我们每个工程都会用到的,现在用的都是sfl4j,本篇文章总结下为什么使用slf4j?
具体的原因请参考这篇文章:http://www.importnew.com/7450.html
总结下来,有以下几个原因:
1)无需关心具体使用的是什么日志框架
使用slf4j相当于只是说明这里会打印日志,但具体使用什么日志框架和什么日志规范,完全不用操心,由具体使用的人来决定。
例如如果你引用了spring, mybatis等,如果他们都使用的是slf4j,那么具体是什么日志框架,打印出的日志格式是怎样的,完全由你自己来决定。
但如果spring用了log4j, mybatis用了logback,那样你就麻烦了,你需要定义两个日志框架和配置。
这是最重要的一点,相当于是解耦。可以把slf4j看作是一个接口,定义了规范,至于具体是使用log4j还是logback等,要看具体的使用者使用了什么日志框架
这对开发开源框架是很有用的,开源的框架就使用slf4j就可以了,具体使用什么日志框架,由用到框架的人来决定,这对双方来说都是好的。
2)slf4j内部进行了日志级别的判断
slf4j去除了检查isDebugEnabled()等,提高了代码的可读性,也简化了代码
原先代码是这样的:
1 | if (logger.isDebugEnabled()) { |
使用slf4j,那不用关心目前日志是什么级别的,因为slf4j内部已经进行了这方面的判断,大大简化了代码
3)slf4j提供了占位符的方法来得到日志信息
slf4j提供了占位符的方法,这个大大简化了写日志的复杂性
原先如果日志中要增加参数,那都需要拼接,例如:
1 | logger.info("The info is: fileName is " + fileName + ", fileType is : " + fileType); |
使用slf4j,可以这样做:
1 | logger.info("The info is: fileName is {}, fileType is {}", fileName, fileType); |
4)slf4j是延迟构建日志信息的
slf4j是延迟构建日志信息的,所以如果不符合当时日志的级别,那么日志信息是不会进行拼接的
因为第2点和第3点,slf4j在内部判断了日志级别,又是提供占位符的方法,而不是直接拼接字符串,所以如果不符合当时的日志级别,
那么参数都不会在内部生成最终的字符串,显然这样降低一些性能。