SLF4j 和 common-logging

jopen 10年前

看现在有很多开源的软件,log记录都是用SLF4j,以前自己是用common-logging觉得十分方便,可以动态的切换实际的log系统,这样common-logging和SLF4J有什么区别。

 

网上找了一篇文档,觉得说明了一些问题:

 

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;</span> 
import org.apache.commons.logging.LogFactory;</span> 
编写日志。 
  
2,仍然在src下使用log4j.properties文件进行配置。 
  
3,使用的所有jar文件: 
1)log4j-1.2.15.jar 这是log4j的库。 Slf4j并不改变这个底层实现库。 
2)slf4j-api-1.5.2.jar   </span>这是Slf4j库。  
3)slf4j-log4j12-1.5.2.jar 这包含Log4j的适配器和静态绑定log4j底层实现。 
4)jcl-over-slf4j-1.5.2.jar 这提供了Commons-Logging接口,以及使用common-loggin的接口,底层还是由SLF4J来决定哪种实现机制 。 
  
    </span>这里,我们需要使用Log4j的原生库,但是不需要Commons-Logging的原生库。 
   
OK,把上面这4个jar包复制到lib下,导入项目中,就可以像以往一样继续使用Apache Common-Logging编写日志了。

来自:http://my.oschina.net/u/1254322/blog/314029