日志门面接口SLF4J

前言

slf4j是门面模式的典型应用。

我们为什么要使用slf4j,举个例子:

我们自己的系统中使用了slf4j-log4j12这个日志系统
我们的系统使用了A.jar,A.jar中使用的日志系统为JCL+JUL
这样,我们的系统就不得不同时支持并维护log4j、JUL2种日志框架,非常不便。
解决这个问题的方式就是引入一个适配层,由适配层决定使用哪一种日志系统,而调用端只需要做的事情就是打印日志而不需要关心如何打印日志,slf4j或者commons-logging就是这种适配层,slf4j是本文研究的对象。

从上面的描述,我们必须清楚地知道一点:slf4j只是一个日志标准,并不是日志系统的具体实现。理解这句话非常重要,slf4j只做两件事情:

提供日志接口
提供获取具体日志对象的方法
slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。

在解决这个问题前,我们先学习下slf4

一、核心包

SLF4J的核心包是slf4j-api,本文使用的是1.7.30版本

<dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.30</version>
</dependency>
public class App {
    private static Logger logger = LoggerFactory.getLogger(App.class);
    public static void main( String[] args ) {
        logger.info("1");
    }
}
//SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
//SLF4J: Defaulting to no-operation (NOP) logger implementation
//SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

slf4j他也不记录日志,通过绑定器绑定一个具体的日志记录来完成日志记录
因为在您的类路径上找不到slf4j适配器,所以将打印此警告

二、适配器

作用:绑定一个具体的日志记录来完成日志记录

2.1 simple适配器
<dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-simple</artifactId>
       <version>X.X.X</version> 
</dependency>
2.2 JUL适配器
<dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-jdk</artifactId>
       <version>X.X.X</version> 
</dependency>
2.3 logback适配器
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-core</artifactId> 
   <version>X.X.X</version> 
</dependency> 
<dependency> 
    <groupId>ch.qos.logback</groupId> 
    <artifactId>logback-classic</artifactId> 
    <version>X.X.X</version> 
</dependency>
2.4 log4j适配器
<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
    <version>X.X.X</version> 
 </dependency>
2.5 log4j2适配器
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>X.X.X</version> 
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>X.X.X</version> 
</dependency>
2.6 JCL适配器
<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-jcl</artifactId>
    <version>X.X.X</version> 
 </dependency>
2.7 注意事项

一个项目中只能一种适配器,否则SLF4J不生效,如下:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
 <!--log4j适配器-->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.30</version>
</dependency>
 <!--logback适配器-->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.10</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.10</version>
</dependency>

项目启动后,程序发出警告。
在这里插入图片描述

三 、桥接器

常用桥接器如下:

3.1 jcl-over-slf4j

作用:将JCL日志系统桥接到slf4j日志系统,底层重写了JCL

现在有一个需求:
我们自己的系统中使用了slf4j-log4j12这个日志系统
我们的系统使用了A.jar,A.jar中使用的日志系统为JCL+JUL
这样,我们的系统就不得不同时支持并维护log4j、JUL2种日志框架,非常不便。
在这里插入图片描述
怎么解决这个问题呢?

这时候SLF4J桥接器就登场了,利用桥接器,我们可以使别的日志系统桥接到SLF4J。
在这里插入图片描述
这样的话,我们项目就统一了使用log4j日志系统了

3.2 jul-to-slf4j

作用:将JUL日志系统桥接到slf4j日志系统

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jul-to-slf4j</artifactId>
   <version>1.7.30</version>
</dependency>
3.3 log4j-to-slf4j

作用:将log4j2日志系统桥接到slf4j日志系统

<dependency>
   <groupId>org.apache.logging.log4j</groupId>
   <artifactId>log4j-to-slf4j</artifactId>
   <version>2.12.1</version>
   <scope>compile</scope>
 </dependency>
3.4 log4j-over-slf4j

作用:将log4j日志系统桥接到slf4j日志系统,底层重写了log4j

<dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>log4j-over-slf4j</artifactId>
      <version>1.7.30</version>
</dependency>
3.5 注意事项

请注意,不能同时部署同种日志的桥接器和连接器

如:不能同时部署jcl-over-slf4j.jar和 slf4j-jcl.jar。前一个jar文件将使JCL将日志记录系统的选择委派给SLF4J,后一个jar文件将使SLF4J将日志记录系统的选择委派给JCL,从而导致无限循环。
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值