日志相关知识梳理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志相关知识梳理相关的知识,希望对你有一定的参考价值。
日志相关知识梳理
- 概述
- 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
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
可以直接打印
SLF4J
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
从上面可以看到只引用slf4j是不能打印日志的,因为slf4j是门面不包含实现框架,需要我们增加绑定器:
这官网给的一个逻辑图
使用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>
绑定器为啥可以打印我们看看其中的依赖关系:
由此可以看出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>
上面的二选其一都可以
由此可见logback自身实现了slf4j标准
绑定log4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.32</version>
</dependency>
这个是log4j没有实现slf4j的标准,是通过适配器模式实现的
适配器层面实现:
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)
log4j2适配器层面代码实现
总结
slf4j 的桥接器如何使用
这种情况就是,我们调用的第三方jar中使用的是这种没有实现的jar,并且也没实现上slf4j标准我们如何操作
看这一篇
多应用中间的日志使用,log4j,log4j2,logback三个日志框架为例
以上是关于日志相关知识梳理的主要内容,如果未能解决你的问题,请参考以下文章
GC(Allocation Failure)引发的一些JVM知识点梳理