官网:http://slf4j.org/index.html,http://slf4j.org/manual.html#binding
The Simple Logging Facade for Java or (SLF4J) serves as a simple facade or abstraction for various logging frameworks, e.g. java.util.logging, log4j and logback, allowing the end user to plug in the desired logging framework at deployment time.
slf4j可以说只是一个壳,使用外观模式,底层的具体log系统可以是“Log4j和java.util.logging,JCL,NOP,simple”。具体使用时,您的代码(特别适合用于您的代码将作为第三方的jar包供别人使用)中,直接使用slf4j-api-1.6.1.jar。
而在别人使用您的jar包时,如果他们的日志系统是Log4j或ava.util.logging则他们将在classpath路径中添加slf4j-log4j12-1.6.1.jar或slf4j-jdk14-1.6.1.jar,这样,您的代码的日志就可以和他们使用的日志系统融合一体了。
具体看log4j12-1.6.1.jar或slf4j-jdk14-1.6.1.jar,是这样简单的几个类:
JCL,Log4j和JDK14都分别有自己的个性的Adapter和Factory,而StaticLoggerBinder等3个类则都是一样的,都是org.slf4j.impl.*。
可想而知,这3个bind的jar,都含有具体的实现类,只能使用其中一个jar。
- LoggerFactory通过StaticLoggerBinder.getSingleton().getLoggerFactory()获得LogFactory,然后再通过该LogFactory来获取logger的
- 但是StaticLoggerBinder类并不在slf4j-api-1.5.10.jar中,分析与具体日志系统相关的jar包,会发现每个 jar包都有一个StaticLoggerBinder类的实现(如slf4j-log4j12-1.5.10.jar、slf4j-simple- 1.5.10.jar、slf4j-jdk14-1.5.10.jar均有StaticLoggerBinder类实现),这就很明白了,slf4j在启 动时会动态到classpath中查找StaticLoggerBinder类,找到之后就可以生成对应日志系统的日志文件了。
另外:
http://blog.youkuaiyun.com/hbcui1984/archive/2010/01/05/5138883.aspx
Apache Commons Logging 和 slf4j也一样,都是Depends on the underlying framework,不过听说commons logging是按顺序查询具体日志系统,commons logging.jar本身带有所有日志系统的Facade了,无须在使用时再按照具体日志系统添加依赖。
见http://en.wikipedia.org/wiki/Java_logging_framework