平时我们引用日志包打印日志时发现和我们预料中的不一致,最常见的就是明明配置了但确不打印日志,所以我简单总结了下java的日志体系.
一.我们日前常用的日志有log4j,log4j2,logback,jul,来协助我们打印日志。
二.
jcl,slf4j为对应的门面,我理解门面其实就相当于java多态,它的实现是可插拔的,比如原来我们使用的logback,现在要替换为log4j2了,因为他们都是基于slf4j的,编码都是面向的接口,改动是无需修改代码,只需要替换依赖jar既可。
1.jcl
jcl支持log4j,jul,jdk13等日志,它是通过动态Class.forName加载的,
优先级为log4j->jul(>=jdk14自带)->jdk13->simpleLog顺序打印,比如动态Class.forName log4j包没有时候会自动再加载jul包,以此顺序,具体可以看log4j包中org.apache.commons.logging.impl.LogFactoryImpl类中classesToDiscover数组中加载顺序。不支持主流的log4j2,logback等,因此现在基本不用,或者用也会桥接到slf4j上。
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
2.slf4j
slf4j可以支持当期主流的日志,log4j,log4j2,logback,当然也支持从jcl那部分桥接到slf4j上,引入依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
上面为要要使用日志和slf4j中间需要引入适配器,比如要是用log4j2,需要引入log4j-slf4j-impl.
三.桥接: 因为我们一个系统可能使用多种日志,这样管理日志文件非常费劲;例如:spring使用jcl,而我们业务代码中用的是log4j2(用slf4j门面),如果不合并可能我们就需要配置两份日志输出路径.因此我们可以通过桥接把jcl桥接到slf4j既可,这样同意变为log4j2了也方便管理,如下面的引入依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.32</version>
</dependency>
最后在整体发一张图