前言:回想自己学习过程中,碰到过很多日志框架,如log4j ,、Jboss-logging,commons-logging…所有特此来记录一下他们之间的关系。
其实日志框架,有点像JDBC 与数据库驱动一样,分为接口和具体的实现。日志框架的接口也叫日志门面,当我们使用框架的时候,就是调用日志门面的方法,具体的实现就是交给日志门面来做。现在对常见的日志框架进行分类。
日志门面 (日志的抽象层) | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) , SLF4j(Simple Logging Facade for Java) , jboss-logging | Log4j , JUL(java.util.logging), Log4j2 ,Logback |
其中JCL是Spring
底层使用的日志框架,但是现在已经停止更新了所以不推荐使用。所以我们一般采用SLF4j
作为日志门面。
那么SLF4j
作为日志门面的话,该如何与众多日志实现框架绑定使用呢。借用官网的一张图
要注意的地方是当SLF4J
绑定log4j
使用的时候,由于log4j
出现的比较早,后来才出现的SLF4J
,log4j
的实现没有考虑SLF4J
这套日志门面规范。所以中间要加一个适配层slf4j-log412.jar
来连接SLF4J
与log4j
。其中过程是,在slf4j-log412.jar
中实现SLF4J
的api,但是的实现的时候调用确是log4j
的方法。
同样SLF4J
与JUL
配合使用的时候,要添加`slf4j-jdk14.jar这个中间适配层。
面对一个现状,Spring(commons-logging)、Hibernate(jboss-logging)、xxxxx,等不同框架使用不同的日志,那么我们该如何统一日志的使用呢。
因为我们知道SLF4J
这个简单的日志门面,可以通过适配器,与不同的日志实现整合。那么我们把所有的日志门面都换成,SLF4J
是不是就能够统一日志了呢。但是这样也会存在问题,如:Spring
底层使用的是commons-logging
,当我们去除它,换成SLF4J
后,程序都会无法运行。所有这个时候我们又需要一个中间包jcl-over-slf4j.jar
。把commons-logging
去除,换成jcl-over-slf4j.jar
。变可以实现
更多的转换如下图:
我们来看一下jcl-over-slf4j.jar
是如何偷梁换柱的。
我们可以看到jcl-over-slf4j.jar
这个jar包里面其实包名叫commons.loging
这就是为什么,添加这个包之后,去除spring底层的commons.loging
,还不会报错。然后LogFactory logFactory = new SLF4JLogFactory();
实例化的是new SLF4JLogFactory();
使用的是SLF4J
,这样偷梁换柱的效果就达到啦。
其他几个中间包也是这种方式偷梁换柱。
总结:
- 推荐使用:slf4j(门面)+logback(实现) [logback是因为log4j的开发者觉得log4j不住,而开发出来跟slf4j适配的]
- 如何让系统中所有的日志都统一到slf4j;
1、将系统中其他日志框架先排除出去 如:(排除spring的commons-loging);
2、用中间包来替换原有的日志框架 如:(jcl-over-slf4j.jar);
3、我们导入slf4j其他的实现。如(logback-class.jar+logback-core.jar)