SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。
驱动和桥接
log4j是一个日志系统。
slf4j是一个日志系统的封装,对外提供统一的API
使用slf4j需要下载slf4j-api-x.x.x.jar 它提供对外一致的API接口,其本身不提供日志实现。假设我们选择log4j作为我们的日志实现,需要下载log4j-x.x.x.jar如果想把slf4j绑定log4j,则需要下载slf4j对log4j的相应”驱动”。slf4j-log4j12-x.x.x.jar这样就可以使用slf4j提供的API,用log4j实现打日志了。所谓驱动,就是实现了slf4j的一些接口,用你喜欢的日志系统打日志。slf4j还支持好多日志系统,并提供了相应的“驱动”包
例如:
slf4j-jdk14-x.x.x.jar是为java.util.logging提供的驱动
slf4j-simple-x.x.x.jar直接绑定System.errlf4j-jcl-x.x.x.jar是为commons-logging提供的驱动
logback-classic-x.x.x.jar是为logback提供的驱动
如果你引入了一个第三方jar包或者你之前的工程使用了commons-logging打日志。你想换成slf4j,你不需要更改代码,你需要使用桥接,你可以引入jcl-over-slf4j.jar,同时去掉commons-logging.jar包,这样之前打的日志会自动切换到你的slf4j中来了。同样还有log4j-over-slf4j.jar and jul-to-slf4j.jar等用于使用其它日志系统的应用自动切换到slf4j统一打日志。
这里其实用到了一种设计模式(Facade设计模式,门面设计模式)。如下图:
实例1:SLF4J+simple
导入:slf4j-api-1.7.21.jar 包
1.新建一个java类slf4jSimpleTest
package com.slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class slf4jSimpleTest{
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
2. 发现运行的时候,出错了。提示Failed to load class “org.slf4j.impl.StaticLoggerBinder”。说明默认的情况下SLF4J会去找默认的实现类。
导入slf4j-simple-1.7.21.jar包
重新执行程序,发现正确输出。结果如下:
[main] INFO com.souvc.log.slf4j.HelloWorld - Hello World
使用slf4j这种记录日志的方式的特点很明显:1、如果我们需要记录的是底层类库或者组件这种东西,就可以不影响或强制要求用户选择哪种日志系统。2、如果我们用特定的日志系统写了代码,但是有一天要求换另一种日志系统,如果之前就用slf4j的api写的,那就很简单,但是如果用具体的一种方式写了以后,那在切换就很麻烦。
实例2:
package com.slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jTest {
// 首先获得日志记录这个对象
static private Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
public static void main(String[] args) {
// 记录error信息
logger.error("[info message]");
// 记录info,还可以传入参数
logger.info("[info message]{},{},{},{}", "abc", false, 123, new Slf4jTest());
// 记录debug信息
logger.debug("[debug message]");
// 记录trace信息
logger.trace("[trace message]");
}
}
具体使用哪种日志系统,这个可以随意切换,切换方式就是将我们的jar包替换成切换的模式
(1)使用slf4j的simple日志系统:
在classpath中加入:slf4j-simple.jar
在classpath中将slf4j-logo.jar换成slf4j-jdk.jar
(3)切换成log4j的日志系统:
在classpath中将slf4j-logo.jar换成slf4j-log4j.jar,注意这在使用log4j的时候,需要自己配置log4j.properites文件或者log4j.xml。
切换成其他的日志,方法都是一样的,直接替换相关日志jar包就可以了。
如果classpath中有多种日志系统,slf就会将每个系统的日志信息都显示出来,这样的话我们就没办法分辨出,这样会很乱