简单日志门面(Simple Logging Facade For Java)SLF4主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现可以交由其他日志框架,例如log4j和logback等。当然slf4j自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j、logback等),中间使用桥接器完成桥接。
SLF4J日志门面主要提供两大功能:
1,日志框架的绑定工
2,日志框架的桥接
导入依赖
<!-- slf4j 日志门面 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- slf4j 内置的简单实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<!-- logback 日志实现 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
<!-- log4j 日志实现 需要导入适配器 -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- jul 日志实现 需要导入适配器 -->
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-jdk14 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
package icu.weizhna.javalog2;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4j {
//日志记录器对象
public static final Logger LOGGER = LoggerFactory.getLogger(Slf4j.class);
//快速开发
@Test
public void slf4jTest(){
//日志输出
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");
LOGGER.trace("trace");
//使用占位符输出日志信息
String name = "hwz";
int age = 18;
LOGGER.info("用户:{} {}",name,age);
//将系统异常信息输出
try {
int a = 1/0;
} catch (Exception e) {
// e.printStackTrace();
LOGGER.error("error:",e);
}
}
}
使用slf4j的日志绑定流程:
1.添加slf4j-api的依赖
2.使用slf4j的API在项目中进行统一的日志记录
3.绑定具体的日志实现框架
1.绑定已经实现了slf4j的日志框架,直接添加对应依赖
2.绑定没有实现slf4j的日志框架,先添加日志的适配器,再添加实现类的依赖
4. slf4j有且仅有一个日志实现框架的绑定〈如果出现多个默认使用第一个依赖日志实现)
桥接旧的日志框架
使用场景:项目初期时没有想到代码的扩展升级方面,就使用了log4j日志实现,但是项目后期想要改为slf4j日志门面+logback日志框架,但是直接改的话就需要改动成千上万的条源代码,这样做是不现实的。
桥接解决的是项目中日志的遗留问题,当系统中存在之前的日志API,可以通过桥接转换到slf4j的实现
1.先去除之前老的日志框架的依赖
2.添加SLF4J提供的桥接组件
3.为项目添加SLF4J的具体实现
现在是使用log4j日志实现
package icu.weizhna.javalog2;
import org.apache.log4j.Logger;
import org.junit.Test;
public class Log4j {
//日志记录器对象
public static final Logger LOGGER = Logger.getLogger(Log4j.class);
@Test
public void test1(){
LOGGER.info("info");
}
}
当改为slf4j日志门面+logback日志框架时,想要不改动源码,需要添加log4j的桥接器
<!-- log4j的桥接器 -->
<!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>