java中常用的日志系统有:
- jcl(Jakarta Commons Logging)
- jul(java.util.logging)
- log4j 1.x
- log4j 2.x
- logback
而slf4j则是一个统一的日志接口,可以通过使用不同的jar包,来使用不同的日志系统实现,而不必更改代码。
具体demo参看java-log-demos
1. 直接使用日志系统
1.1 JCL/Jakarta commons-logging
commons-logging日志系统。这其实也是一个日志接口,底层使用log4j或JDK Logging实现。
如果仅依赖commons-logging.jar,则会使用JUL(java.util.logging)作为实现,其效果是日志中有很多中文。
如果添加了log4j 1.x相关依赖log4j:log4j:1.2.17
,就会使用log4j 1.x作为日志的实现。
1.2 JUL/java.util.logging
这是JDK自带的日志系统,其特征是输出信息是中文。
应用直接使用JDK自带的日志系统书写日志。
1.3 log4j 1.x
应用直接使用log4j.jar
写日志。仅需添加log4j:log4j:1.2.17
依赖即可。
配置文件为log4j.properties
,详情参看log4j.properties配置详解
1.4 log4j 2.x
应用直接使用log4j 2.x对应的jar包书写日志。仅需添加org.apache.logging.log4j:log4j-core:2.12.1
依赖即可。
1.5 logback
logback一定会依赖slf4j的接口,所以使用logback的时候,一定使用了slf4j-api.jar的接口。仅需添加ch.qos.logback:logback-classic:1.2.3
即可引入所有依赖的jar包。
2. 使用slf4j(slf4j-api.jar)适配日志系统
2.1 仅使用slf4j-api
此时没有日志系统的具体实现,所以会报错
2.2 使用slf4j-nop作为slf4j-api的实现
slf4j-nop不会输出任何日志,仅是让slf4j-api.jar不再报错。
2.3 使用slf4j-simple作为slf4j-api的实现
使用slf4j-simple作为日志的实现类。
仅需添加org.slf4j:slf4j-simple:1.7.30
即可引入所有依赖的jar包
2.4 使用jcl(commons-logging)及其实现作为slf4j-api的实现
commons-logging也是一个接口API,所以也需要具体的日志系统实现
2.5 使用JDK自带日志系统(JUL)作为slf4j-api的实现
这里的适配层为slf4j-jdk14.jar
,使用java.util.logging作为日志系统的实现
仅需依赖org.slf4j:slf4j-log4j12:1.7.30
,就可以引入所有依赖。
2.6 使用log4j 1.x作为slf4j-api的实现
注意这里有一个适配层(adapter layer),其jar包围红色部分slf4j-log4j12.jar
。适配层把slf4j-api接口的操作转换成会log4j 1.x的日志操作。
仅需依赖org.slf4j:slf4j-log4j12:1.7.30
,就可以引入所有依赖
2.7 使用log4j 2.x作为slf4j-api的实现
这里的适配层为log4j-slf4j-impl.jar
。
仅需依赖org.apache.logging.log4j:log4j-slf4j-impl:2.12.1
,就可以引入所有依赖。
2.8 使用logback作为slf4j-api的实现
同1.3 logback完全一样。logback默认就会使用slf4j-api作为其接口,应用系统使用logback时,会直接通过slf4j-api接口进行操作。
3. 现有日志系统通过slf4j转为其它日志系统-bridge
使用原生的日志系统时,如果想要不修改代码换成另外一种日志系统,则需要使用bridge。图中橘色的都是bridge。其原理是通过bridge把一种日志系统转成slf4j,然后再转成其它日志系统。使用bridge时,一般要求删除原来的日志系统jar包,bridge会有和原来jar包一样的接口,所以应用代码不必修改。
使用bridge时,注意红色虚线连接bridge对应的jar包和adaptation layer对应的jar包不能同时存在,否则会有堆栈溢出错误。流入jcl-over-slf4j.jar不能和slf4j-jcl.jar同时存在。
每一类下面的依赖,灰色字体部分都不必显示引入,仅需引入黑色字体依赖,即可引入全部jar包。
注意logback由于必须使用slf4j-api来实现,所以无需bridge把他替换成其它日志系统,仅需删除logback-classic.jar和logback-core.jar,然后再引入其它实现即可。这和本节内容无关,就不再叙述。
3.1 jcl日志系统替换为其它日志系统
application直接使用jcl日志系统的接口,想要替换成其他日志系统,则先使用jcl-over-slf4j.jar
把jcl转成slf4j。注意图中jcl到bridge是虚线,说明不必删除jcl相关jar包。
根据想要转成的日志系统,使用不同的adaptation layer进行实现。例如想要转成log4j 2.x,则需要使用log4j-slf4j-impl.jar,把slf4j对接到log4j 2.x。然后再加上log4j 2.x的实现类log4j-api.jar和log4j-core.jar,即可完成日志系统的替换,而不必修改应用代码。
注意红色虚线部分,jcl-over-slf4j.jar不能和slf4j-jcl.jar同时存在,否则会报错。
3.2 其它日志系统的替换
原理和jcl差不多,就不再赘述。