提到java日志,就会想到log4j,slf4j,logback,commons-logging,java.util.logging等一连串名字,pom文件里引用了一堆依赖,但并不清楚它们的原理。
概述
经过一番整合和厮杀,现在Java日志领域分成两大阵营:JCL和Slf4j,JCL用户基数大,但Slf4j后来居上,用户群体逐步上升,现在公司采用的就是Slf4j。
JCL
既然日志框架层出不穷,当系统产生依赖时,日志就会出现问题,无法管理,因此,Apache推出了Jakarta Commons Logging,JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),通过门面模式对外提供一个统一的调用接口,屏蔽子系统之间复杂的调用关系,对客户端来讲,使用起来更容易。
支持运行时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用Commons Logging的接口,底层实现可以是log4j,也可以是Java Util Logging。 使用JCL一般(如果是log4j可以不需要)需要一个配置commons-logging.properties
在classpath上,这个文件有一行代码:
org.apache.commons.logging.LogFactory= org.apache.commons.logging.impl.LogFactoryImpl
这个是告诉JCL使用哪个日志实现,JCL会在classpath下去加载对应的日志工厂实现类,具体的日志工厂实现类可以是log4j实现,可以是jul实现等等。用户只需要依赖JCL的api即可,对日志系统的替换只需要修改下commons-logging.properties
文件切换到对应的日志工厂实现即可。但是我们也可以看到因为JCL是运行时去加载classpath下的实现类,会有classloader问题。而且因为log4j尚不支持参数占位符打日志的方式,所以JCL也会更加无力。
SLF4J
SLF4j是Simple Logging Facade for Java的简称,即java的简单日志门面。作者Ceki Gülcü先后创建了slf4j(日志门面接口,类似于Commons Logging)和Logback(Slf4j的实现)两个项目,并回瑞典创建了QOS公司,QOS官网上是这样描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一个通用,可靠,快速且灵活的日志框架)。
类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。
对比JCL和SLF4J,SLF4J实现更优秀:
SLF4J桥接与适配
为了将JCL,Log4J,JUL的日志统一到slf4j的抽象层,分别定义了一组桥接器。按照官方描述:
Often, some of the components you depend on rely on a logging API other than SLF4J. You may also assume that these components will not switch to SLF4J in the immediate future. To deal with such circumstances, SLF4J ships with several bridging modules which redirect calls made to log4j, JCL and java.util.logging APIs to behave as if they were made to the SLF4J API instead.
分析这张图,通过引入jcl-over-slf4j.jar
,log4j-over-slf4j.jar
,jul-to-slf4j.jar
,分别将原本JCL,log4j,jul的日志接口桥接到slf4j,然后通过一个适配层slf4j-log412.jar
,slf4j-jdk14.jar
提供具体的日志实现(logback不需要)。
详细说明参考官方文档:
https://www.slf4j.org/legacy.html
需要注意的问题
以上红色箭头代表互斥,可以看到,最终实现层只有一种,同时,也不需要将同一种日志系统实现经过slf4j桥接适配给自己。
性能对比
https://www.sitepoint.com/which-java-logging-framework-has-the-best-performance/
https://blog.takipi.com/the-logging-olympics-a-race-between-todays-top-5-logging-frameworks/
参考
https://www.cnblogs.com/chenhongliang/p/5312517.html
http://ieye.iteye.com/blog/1924215
http://blog.csdn.net/yycdaizi/article/details/8276265
https://www.cnblogs.com/chenhongliang/p/5312517.html