一、slf4J简介:
slf4J(simple logging Facade for java)是为各种日志框架(如 java.util.logging,logback, log4j) 提供的一个简单统一的
接口,从而允许用户能够在部署的时候配置所希望的日志框架。
二、能看得懂英语的又有耐心的朋友可以拜访slf4j官网:http://www.slf4j.org
三、为何使用slf4j?
正如简介中所描述的,使用slf4j可以灵活配置各种不同的log框架,还可以在项目集成或引用的时候减少依赖包。比如A项目使用log4j作为实现的日志框架,而B项目使用的是logback作为实现的日志框架,如果A、B项目整合,那么只需要一个日志框架即可,如果这两个项目都是使用slf4j API,那么就能轻松实现了。
四、来自官网的例子 HelloWorld
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public classHelloWorld {
public static voidmain(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
这个例子中只需要将slf4j-api-1.7.10.jar加入类路径即可。编译运行你会发现这个仅有slf4j-api接口,却没有实现的日志框架居然编译通过,只是运行时控制台将输出如下警告:
SLF4J: Failed toload class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting tono-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinderfor further details.
通过添加一个基于slf4j接口实现的日志框架,如slf4j-simple-1.7.10.jar到类路径,那么警告将没有,日志能够正常输出如下。
[main]INFO HelloWorld - Hello World
由此可见,可以单纯使用slf4j-api,只是所有日志将被忽略。只要再结合其他日志框架即可输出日志了。
五、窥探slf4j精髓
从设计模式的角度上看,Slf4j-api在设计模式中是外观(facade)模式,能够实现完全解耦,对于如log4j这样一个不是基于slf4j-api实现的日志框架就需要一个slf4j-log4j.jar包作为适配器适配接口。
对slf4j做源码分析,不难看出slf4j-api与其他日志框架之间的绑定是仍是静态绑定的,在LoggerFactory类的bind()函数中,会通过类加载器查找类路径中是否有org.slf4j.impl.StaticLoggerBinder类,而slf4j-api中本身没有这个类,该类需由其他日志框架提供。并且band过程会检查是否有多个该类,这样会造成歧义,因此在类路径中,有且仅有一个具体实现的日志框架即可。
关于slf4j的源码分析,推荐其他两篇优秀的博文: