转载:SLF4j 和 common-logging 适配

Apache Common-Logging 是广泛使用的 Java 日志门面库。我以前一直都使用它和 log4j 编写日志。

Apache Common-Logging 通过动态查找的机制,在程序运行时自动找出真正使用的日志库。

Apache Common-Logging 一直都运作得很好。直到最近,我写 OSGI 插件时,它不能工作了。

原因是 Apache Common-Logging 使用了 ClassLoader 寻找和载入底层的日志库。而 OSGI 中,不同的插件使用自己的 ClassLoader。

一个线程的 ClassLoader 在执行不同的插件时,其执行能力是不同的。

OSGI 的这种机制保证了插件互相独立,然而确使 Apache Common-Logging 无法工作!

解决之道是使用新的日志门面库 Slf4j。

Slf4j 库类似于 Apache Common-Logging。但是,他在编译时静态绑定真正的 Log 库。使用 Slf4j 时,如果你需要使用某一种日志实现,那么你必须选择正确的 Slf4j 的 jar 包的集合。

这确实麻烦了一点,但总算可以在 OSGI 中开发日志了。

其实,这一点点工作也不算麻烦。

使用CommonLog接口而实际由 Slf4j 和 Log4j 实现的过程

  1. 项目中照常使用
import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

编写日志。

  1. 仍然在 src 下使用 log4j.properties 文件进行配置。

  2. 使用的所有 jar 文件:

    • log4j-1.2.15.jar 这是log4j的库。 Slf4j并不改变这个底层实现库。
    • slf4j-api-1.5.2.jar 这是Slf4j库。
    • slf4j-log4j12-1.5.2.jar 这包含Log4j的适配器和静态绑定log4j底层实现。
    • jcl-over-slf4j-1.5.2.jar 这提供了Commons-Logging接口,以及使用common-loggin的接口,底层还是由SLF4J来决定哪种实现机制 。

这里,我们需要使用 Log4j 的原生库,但是不需要 Commons-Logging 的原生库。

OK,把上面这 4 个 jar 包复制到 lib 下,导入项目中,就可以像以往一样继续使用 Apache Common-Logging 编写日志了。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论