Java 日志系列篇二 slf4
起手式
忘了什么时候听老师说过,牛逼的公司只管定义接口,屌丝厂商实现接口,类似 JDBC 的实现便是如此,用在 slf4j, 总觉得有些类似,本来 SUN 有机会在需求产生之前设计一套漂亮的日志框架来一统天下,可惜偏偏要拖到 JDK1.4, 而这套原生的日志框架也没有足够漂亮,而之前早已经经过市场考验的日志框架也在不断持续的改进,log4j,logback, common-logging 等等已经在许多系统中长久驻足。
翻到Java中的日志框架史,看到下面有趣的文字
最早出现的日志框架是apache提供的log4j,使用最为广泛,成为了Java日志的事实上的标准;然而当时Sun公司在jdk1.4中增加了JUL(java.util.logging),企图对抗log4j,于是造成了混乱,当然此时也有其它的一些日志框架的出现,如simplelog等,简直是乱上加乱。
解决这种混乱的方案出现了:抽象出一个接口层:于是开源社区提供了commons-logging,被称为JCL。抽象时参考了log4j、JUL、simplelog,对它们进行了适配或转接,这样就一统江湖了。
看上去现在已经非常完美了,但好景不长,log4j的作者(Ceki Gülcü)觉得JCL不够优秀,他要搞出一套更优雅的出来,于是slf4j就出现了,并且亲自实现了一个亲子——logback(有点,老子又回来了的感觉^_^)。好吧,确实更优雅了,但混乱局面又出现了,之前使用JCL的怎么办呢,于是Ceki Gülcü在slf4j又对JCL作了桥接转换,然而事情还没完,Ceki Gülcü又回来拯救自己的“大阿哥”——log4j,于是log4j2就诞生了,同时log4j2也加进了slf4j体系中。
PS:SLF4J是在Compile绑定实现的,而JCL是Runtime时绑定的。
正文
Apache user manual 选译
SLF4J ( The simple logging facade for java ) 作为诸多日志框架的门面或者抽象,这些框架包括java.util.logging, logback 和 log4j. slf4j 允许终端用户在部署系统时想使用插件一样来选择使用不同的日志框架。
关于如何绑定一个日志框架
创建工程,将 slf4j-api-1.7.13.jar 加入 class path , 以下程序编译运行
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class HelloWorld { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(HelloWorld.class); logger.info("Hello World"); } }
控制台输出
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
可见单纯的 slf4j 只是定义了一套接口,以及其他日志框架的转接器
现在我们为 slf4j 绑定最简单的实现,在 classpath 加入 slf4j-simple-1.7.13.jar
重新编译运行,控制台输出:
0 [main] INFO HelloWorld - Hello World
可以绑定的日志框架的桥接 jars
slf4j-log4j12-1.7.13.jar
log4j 1.2(一个广泛使用的日志框架)版本的桥接器,你可以将 log4j.jar 加入classpath
slf4j-jdk14-1.7.13.jar
java.util.logging 的桥接器,JDK原生日志框架
slf4j-nop-1.7.13.jar
NOP 桥接器,静默丢弃一切日志
slf4j-simple-1.7.13.jar
一个简单实现的桥接器,该实现输出所有事件到 System.err. 只有INFO以及高于该级别的消息被打印,在小型应用中它也许是有用的。
slf4j-jcl-1.7.13.jar
Jakarta Commons Logging 的桥接器. 这个桥接器将SLF4j所有日志委派给 JCL
logback-classic-1.0.13.jar (requires logback-core-1.0.13.jar)
slf4j 的原生实现,logback 直接实现了 slf4j 的接口,因此使用 slf4j 与 logback 的搭配也暗示了严格的零内存计算溢出