log
log桥接工具jcl-over-slf4j使用(项目用于排除commons-logging依赖的影响)
过程如下:
Component(服务)
|
| log to Apache Commons Logging(JCL)
V
jcl-over-slf4j.jar — (redirect) —> SLF4j —> slf4j-log4j12-version.jar —> log4j.jar —> 输出日志
log4j-over-slf4j 可以理解为将log4j排除转成slf4j接口,把旧的日志log4j适配到slf4j
如何在项目中使用Slf4j
Slf4j与其他各种日志组件的桥接
jar包名 | 说明 |
---|---|
slf4j-log4j12-1.7.13.jar | log4j1.2版本的桥接器,你需要将log4j.jar加入classpath。 |
slf4j-jdk14-1.7.13.jar | java.util.logging的桥接器,JDK原生日志框架。 |
slf4j-nop-1.7.13.jar | NOP桥接器,默默丢弃一切日志。 |
slf4j-simple-1.7.13.jar | 一个简单实现的桥接器,该实现输出所有事件到System.err. 只有INFO以及高于该级别的消息被打印,在小型应用中它也许是有用的。 |
slf4j-jcl-1.7.13.jar | Jakarta Commons Logging 的桥接器. 这个桥接器将SLF4j所有日志委派给JCL。 |
logback-classic-1.0.13.jar(requires logback-core-1.0.13.jar) | slf4j的原生实现,logback直接实现了slf4j的接口,因此使用slf4j与 logback的结合使用也意味更小的内存与计算开销 |
具体的接入方式参见下图
如何桥接遗留的api
在实际环境中我们经常会遇到不同的组件使用的日志框架不同的情况,例如Spring Framework使用的是日志组件是Commons logging,XSocket依赖的则是Java Util Logging。当我们在同一项目中使用不同的组件时应该如果解决不同组件依赖的日志组件不一致的情况呢?现在我们需要统一日志方案,统一使用SLF4J,把他们的日志输出重定向到SLF4J,然后 SLF4J 又会根据绑定器把日志交给具体的日志实现工具。Slf4j带有几个桥接模块,可以重定向log4j,JCL和java.util.logging中的API到Slf4j。
遗留的api桥接方案
jar包名 | 作用 |
---|---|
log4j-over-slf4j-version.jar | 将log4j重定向到slf4j |
jcl-over-slf4j-version.jar | 将commos logging里的Simple Logger重定向到slf4j |
jul-to-slf4j-version.jar | 将Java Util Logging重定向到slf4j |
桥接方式参见下图
使用slf4j桥接要注意事项
在使用slf4j桥接时要注意避免形成死循环,在项目依赖的jar包中不要存在以下情况。
多个日志jar包形成死循环的条件 | 产生原因 |
---|---|
log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在 | 由于slf4j-log4j12.jar的存在会将所有日志调用委托给log4j。但由于同时由于log4j-over-slf4j.jar的存在,会将所有对log4j api的调用委托给相应等值的slf4j,所以log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在会形成死循环 |
jul-to-slf4j.jar和slf4j-jdk14.jar同时存在 | 由于slf4j-jdk14.jar的存在会将所有日志调用委托给jdk的log。但由于同时jul-to-slf4j.jar的存在,会将所有对jul api的调用委托给相应等值的slf4j,所以jul-to-slf4j.jar和slf4j-jdk14.jar同时存在会形成死循环 |