日志门面和日志框架(门面SLF4J)
一、SLF4J简介
简单日志门面(Simple Logging Facade For Java) SLF4J主要是为了给Java日志访问提供一套标准、规范的API框架,其主要意义在于提供接口,具体的实现交由其他日志框架,例如log4j2和logback等。当然slf4j自己也提供了功能较为简单的实现,但是一般很少用到。对于一般的Java项目而言,日志框架会选择slf4j-api作为门面,配上具体的实现框架(log4j2、logback等),中间使用桥接器完成桥接。所以我们可以得出SLF4J最重要的两个功能就是对于日志框架的绑定以及日志框架的桥接。
二、 桥接技术
通常,我们依赖的某些组件依赖于SLF4J以外的日志API。我们可能还假设这些组件在不久的将来不会切换到SLF4J。为了处理这种情况,SLF4J附带了几个桥接模块,这些模块会将对log4j,JCL和java.util.logging API的调用重定向为行为,就好像是对SLF4J API 进行的操作一样。
三、SLF4J核心jar包
<dependency>
<!--日志门面核心包 -->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<dependency>
<groupId>日志实现框架</groupId>
<artifactId>日志实现框架</artifactId>
</dependency>
注:SLF4J依赖slf4j-api包和日志实现框架包,如果不导入任何日志实现框架的话,会报错
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation
四、入门案例
1. 日志级别
public class Slf4jTest {
/**
* SLF4J对日志的级别划分:trace,debug,info,warn,error
* trace:日志追踪信息
* debug:日志详细信息
* info:日志关键信息
* warn:日志警告信息
* error:日志错误信息
*/
@Test
public void test01(){
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
logger.trace("trace:日志追踪信息");
logger.debug("debug:日志详细信息");
logger.info("info关键信息");
logger.warn("warn:日志警告信息");
logger.error("error:日志错误信息");
}
}
2. 日志动态信息
/**
* 动态信息
*/
@Test
public void test02(){
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
String name="Jean";
Integer age=18;
logger.info("学生姓名:{},年龄{}",name,age);
}
3. 日志记录异常信息
日志对于异常信息的处理:一般情况下,我们在开发中的异常信息,都是记录在控制台上(我们开发环境的一种日志打印方式)。我们会根据异常信息提取出有用的线索,来调试bug。
但是真实生产环境中(项目上线),对于服务器或者系统相关的问题。在控制台上其实也会提供相应的异常或者错误信息的输出。但是这种错误输出方式(输出的时间,位置,格式。。。)都是服务胸膛默认的。
我们可以通过日志技术,将异常以日志打印的方式,进行输出查看。输出的时间,位置(控制台,文件),格式,完全由我们决定输出。
/**
* 日志记录异常信息
*/
@Test
public void test03(){
Logger logger = LoggerFactory.getLogger(Slf4jTest.class);
try{
Integer.parseInt("123a");
}catch (Exception e){
//e是引用对象,不用用{}做占位符
logger.info("具体信息是:",e);
}
}
五、SLF4J日志门面对日志进行集成的3种情况
1. 常见的日志框架及门面
日志实现框架:JUL,log4j,logback,log4j2
常见的日志门面:JCL,slf4j
出现顺序:log4j->JUL->JCL->slf4j->logback->log4j2
2. 日志集成的3种情况
- 在没有绑定任何日志实现的基础之上,日志是不能绑定实现任何功能的
- logback和simple(包括nop):都是slf4j时间线之后提供的日志实现,所以API完全遵循slf4j进行的设计。那么我们只需要导入想要使用的日志实现依赖,即可与slf4j无缝衔接。
- log4j和JUL:都是slf4j门面时间线前面的日志实现,所以API不遵循slf4j进行设计。通过适配器桥接的基数,完成的域日志门面的衔接。
六、SLF4J集成logback日志实现框架
1. slf4j集成多个日志框架
slf4j集成多个日志框架会报警告。哪个先导入就使用哪个日志实现框架。所以我们在应用中仅仅需要一种日志实现框架。
SLF4J: Class path contains multiple SLF4J bindings.
2. slf4j集成logback日志实现框架
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
七、 SLF4J集成log4j日志框架
由于log4j是在slf4j之前出品的日志框架实现,所以并没有遵循slf4j的API规范。之前集成的logback,是在slf4j之后出品的日志框架实现,logback就是按照slf4j的标准指定的API,所以我们导入依赖就能用。
如果需要slf4j集成log4j,就需要绑定一个适配器,适配器就叫做slf4j-log4j12.
<!--slf4j日志门面 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!--slf4j集成log4j的适配器 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>
<!--log4j日志实现 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
当然,log4j.properties配置文件依然需要。
八、SLF4J集成log4j2日志框架
1. slf4j集成log4j2步骤共4步
- 导入slf4j日志门面
- 导入log4j2的适配器
- 导入log4j2日志门面
导入log4j2日志实现
org.slf4j
slf4j-api
1.7.32
org.apache.logging.log4j
log4j-slf4j-impl
2.14.1
org.apache.logging.log4j
log4j-api
2.14.1
org.apache.logging.log4j
log4j-core
2.14.1
2. 集成原理
slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现。
3. log4j2.xml配置文件
log4j2同样是默认加载类路径(resources)下的log4j2.xml文件中的配置。
还没有评论,来说两句吧...