日志相关知识梳理

  • ​​概述​​
  • ​​JCL​​
  • ​​SLF4J​​
  • ​​使用jcl绑定器​​
  • ​​绑定 logback​​
  • ​​绑定log4j​​
  • ​​log4j2​​
  • ​​总结​​
  • ​​slf4j 的桥接器如何使用​​

概述

日志我们工作当中经常使用,我还没真心认真梳理过其中的知识,感觉比较惭愧今天把这个相关知识梳理下,下一篇写一下spring5日志的改造,如果不提前梳理下我感觉很难把spring5和spring4日志不同之处说明白

日志对于编程人员来说应该是十分重要的僚机了
当下比较流行的几款日志框架分别是JCL, Slf4j,jboss-logging,log4j,log4j2,logback和JUL。我靠这么多框架,应该还有我没举例出来的;

这些其中有些是日志实现框架有些是日志门面:

门面: JCL,slf4j,jboos-logging
实现: log4j,logback, log4j2,JUL

日志相关知识梳理_数据库

说下其中:这几个框架的历史:
slf4j, log4j,logback 这三个的作者是同一个人ceki, log4j作者认为太烂不再推荐使用,自己又写了一个logback

log4j2 这个是apache 实现的

JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。JCL采用了设计模式中的“适配器模式”,它对外提供统一的接口。大家一般选JCL,会用JCL+Log4J的组合方案,但是JCL出现的时候是为了服务大型项目,比较专业,也相对复杂一些。
jboss-logging也是同样的问题,不普适。
所以一般我们会选择Slf4j作日志门面。顺便说一下,Slf4j,JCL,Log4j,logback的作者是同一个人,非常了不起的大佬 ,cike。

对于日志实现的选择,log4j的作者说log4j太烂了,他已经不想去改了。
于是logback应运而生。哈哈,至于JUL,只能说太简陋了,不想用。
刚刚好,Slf4j和logback也是一对黄金搭档。

但是我再工作中经常使用slf4j+log4j2…log4j2设计的比较先进,效率比较高

JCL

日志相关知识梳理_spring_02

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>

日志相关知识梳理_apache_03


可以直接打印

SLF4J

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>

日志相关知识梳理_jar_04

从上面可以看到只引用slf4j是不能打印日志的,因为slf4j是门面不包含实现框架,需要我们增加绑定器:

日志相关知识梳理_数据库_05


这官网给的一个逻辑图

日志相关知识梳理_jar_06

使用jcl绑定器

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-jcl -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.7.32</version>
</dependency>

日志相关知识梳理_数据库_07

绑定器为啥可以打印我们看看其中的依赖关系:

日志相关知识梳理_数据库_08


由此可以看出slf4j-jcl依赖了commons-logging这个实现日志

绑定 logback

后面看logback的时候我们知道logback实现了slf4j标准,其实就不用这么一个搞法

<!--<dependency>-->
<!--<groupId>ch.qos.logback</groupId>-->
<!--<artifactId>logback-core</artifactId>-->
<!--<version>1.2.5</version>-->
<!--</dependency>-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.5</version>
</dependency>

上面的二选其一都可以

日志相关知识梳理_jar_09


日志相关知识梳理_jar_10

由此可见logback自身实现了slf4j标准

绑定log4j

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.32</version>
</dependency>

日志相关知识梳理_apache_11


日志相关知识梳理_apache_12

这个是log4j没有实现slf4j的标准,是通过适配器模式实现的
适配器层面实现:

日志相关知识梳理_apache_13

log4j2

<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.3</version>
</dependency>

由下图可以看出log4j-slf4j-impl 中直接依赖了slf4j(slf4j-api)

日志相关知识梳理_spring_14

日志相关知识梳理_jar_15


log4j2适配器层面代码实现

日志相关知识梳理_数据库_16

总结

日志相关知识梳理_jar_17

slf4j 的桥接器如何使用

这种情况就是,我们调用的第三方jar中使用的是这种没有实现的jar,并且也没实现上slf4j标准我们如何操作
看这一篇
​多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例​​