一、写在前面
log4j2、logback、slf4j都是和日志相关的。在我们实际的工作中,毋庸置疑的是我们都会涉及到。但是大家有没有想过它们之间的关系呢?不怕大家笑话,大狮兄工作近7年,也是在去年的时候才搞清楚它们之前的关系。在我以前的认知里,log4j2和logback是同等级的,可以理解为兄弟的关系,但是对于slf4j我只知道它是和日志相关的,但具体到它和log4j2、logback的关系…
二、SLF4J是什么?
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.
官网的大概意思是:SLF4J是一个可以充当不同日志框架门面的角色,它允许用户在部署的时候可以自由切换底层的日志框架实现。
那么日志框架门面是什么意思呢,门面字面意思就是外表、外观。日志框架门面简单理解就是它仅仅给所有日志框架提供统一的外观(也就是配置),不提供具体的日志服务。具体的日志服务由内部通过使用不同的实现(也就是jar包)来提供。
举个例子:我们都知道菜鸟裹裹快递柜,它不提供快递寄件服务,只是负责管理各个快递公司的快递。具体的寄件服务由中通、申通等快递公司提供,而具体选择哪个快递公司寄件是由用户决定的。所以菜鸟裹裹我们就可以理解为日志门面,而各个快递公司就是各个日志框架实现。
三、LOGBACK与LOG4J2的关系
先来看三张图:
从上面几张图我们可以看到,logback和log4j2都是slf4j日志门面实现的其中之一,它们之间有着怎样的联系呢?谈论logback和log4j2,就不得不提log4j。
log4j是一个程序员大神开发出来的基于Java的日志服务,后来捐献给了Apache基金会,成为了Apache日志服务的一个子项目,大神也参与了其中的开发支持。后来大神和Apache产生了一些矛盾,大神出走,另起炉灶,开发出了和log4j使用几无差别的logback框架,并在框架中修复了很多log4j的bug,同时性能也有了很大的提升。因为和log4j的使用基本上没有什么差别,logback渐渐的被开发者接受。
Apache的log4j由于logback的竞争,日渐式微,终于在2015年,Apache宣布log4j不再维护,建议用户的项目全部迁移到log4j2。Apache log4j2也就是Apache log4j的继任者,它不仅修复了log4j的bug,同样借鉴了logback的优点,在多线程方面也凸显了自己的优势,相关的多线程性能检测可以自行百度。
四、LOGBACK与LOG4J2的使用
日志服务的使用一定是门面+框架实现,所以不管使用哪种日志框架,都需要引入门面,也就是slf4j。
<!-- slf4j核心依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
1. logback使用
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
</dependency>
2. log4j2使用
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.19.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.19.0</version>
</dependency>
这里需要友善提醒一下,log4j2引入的时候需要额外添加一个log4j-slf4j-impl的依赖,也称桥接包,是和日志门面连通用的。log4j的使用也会有,而logback则没有。
五、总结
Log4J2 、LogBack都是具体的日志框架实现。使用时要和门面日志(SLF4J)搭配使用。