之前的文章中介绍了Java日志体系,可以看出java日志体系是有些混乱的,slf4j作为java的日志门面,统一了各个日志框架,但是由于应用中一般都会集成各种组件,而这些组件又使用了各种不同的日志技术,怎么能够让这些日志进行统一呢?下面就来介绍下slf4j中的强大武器,bridge(桥接器)。
假设我们的一个应用app1使用 了slf4j+jul的方式记录日志,app1依赖了一个名叫app2的组件,但是app2本身使用的是log4j来记录日志,现在想让这两个app使用同一种比如jul的方式打印日志。
slf4j bridge官网
从这幅图片中可以看出,slf4j通过各种桥接器,比如jcl-over-slf4j、log4j-over-slf4j、jul-to-slf4j等将各种日志统一到了一起。
示例:
import org.apache.log4j.Logger;
public class Log4j {
public static void main(String[] args) {
Logger logger = Logger.getLogger(Log4j.class);
logger.info("log4j");
}
}
Dependency: log4j-1.2.17.jar
执行程序打印日志,可以看出日志是使用log4j来记录的。
Dependency: slf4j-api-1.7.25.jar、log4j-over-slf4j-1.7.25.jar(桥接器)、slf4j-jdk14-1.7.25.jar(绑定器)
执行程序打印日志,可以看出日志实现已切换到jul。
最后我们用一张图来展示下上面问题的解决方案。
其它:
从官方文档中可以看出,桥接器主要是针对我们无法控制的各种组件依赖,为了统一日志实现而提供的解决方案。如果这些组件我们自身可以控制 ,可以通过使用slf4j migrator 工具来实现日志的迁移(代码替换)。