日志门面和日志框架(门面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步

  1. 导入slf4j日志门面
  2. 导入log4j2的适配器
  3. 导入log4j2日志门面
  4. 导入log4j2日志实现
<!--slf4j日志门面 -->
<dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.32</version>
</dependency>
<!--log4j2适配器 -->
      <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-slf4j-impl</artifactId>
      <version>2.14.1</version>
</dependency>
<dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
      <version>2.14.1</version>
</dependency>
<!--log4j2日志实现 -->
<dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
      <version>2.14.1</version>
</dependency>

2. 集成原理

slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现。

3. log4j2.xml配置文件

log4j2同样是默认加载类路径(resources)下的log4j2.xml文件中的配置。

猜你喜欢

转载自blog.csdn.net/weixin_51725434/article/details/128627909