日志门面的出现,目的就是在任何日志实现框架之间随意切换,而不需要改动一行代码。 所以如果你的代码中使用了slf4j-api打印日志。你可以通过更换适配包实现,更好不同的日志框架。

但是如果你的业务代码,或者依赖的sdk,使用了其它日志框架打印日志,例如commons-logging. 甚至直接使用了log4j等打印日志。怎么样切换到统一的日志框架呢?

Slf4j还提供了另外一系列的包:叫做桥接(Bridging)包,原理就是替换log4j,jul,jcl等日志框架的包,把日志导向slf4j。桥接包的原理,就是重写对应日志框架的api和实现,内部使用slf4j打印日志。

下图是slf4j官方提供的:

zhaoyanblog-2016-03-05-06-05-53

桥接到slf4j 1、jcl/log4j->slf4j 把对应的commons-logging、log4j包删除。 增加jcl-over-slf4j-1.7.xx.jar和log4j-over-slf4j-1.7.xx.jar包 2、jul->slf4j 因为jdk的logging是无法删除的,所以jul-to-slf4j-1.7.xx.jar是无法通过替换api的方式,实现对jul的替换。它是提供了一个jdk的扩展org.slf4j.bridge.SLF4JBridgeHandler 需要配置到jdk的logger.properties中 handlers = org.slf4j.bridge.SLF4JBridgeHandler 3、log4j2->slf4j Log4j2到slf4j的桥接包,是log4j2官方提供的。叫做: log4j-to-slf4j-2.x.jar 但是log4j2也提供了占位符的形式的日志,所以日志消息也可能会在传递给slf4j之前要先对日志进行格式化,官方文档说这个过程可能存在一定的性能损失。所以不建议这么做。 日志框架切换举例 这样,通过slf4j,我们可以实现任何日志框架之间的切换,而不需要修改代码。举例说明: 1、之前是commons-logging+log4j 打日志,现在想用slf4j+logback打日志。 删除 commons-logging-1.x.jar log4j-1.2.xx.jar 增加 jcl-over-slf4j-1.7.xx.jar slf4j-api-1.7.xx.jar logback-classic-1.1.x.jar logback-core-1.1.x.jar 即可完成切换

2、之前直接用log4j打日志,现在想用log4j2打日志 删除 log4j-1.2.xx.jar 增加 log4j-over-slf4j-1.7.xx.jar slf4j-api-1.7.xx.jar log4j2-api-2.x.jar log4j2-core-2.x.jar 即可完成切换