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差不多,就不再赘述。