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