关于java:Java常用日志系统解析

33次阅读

共计 2421 个字符,预计需要花费 7 分钟才能阅读完成。

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

正文完
 0