市面上的日志框架
JUL, JCL , Log4j , Log4j2, Logback , SLF4J.
Spring Boot 在框架内部使用 JCL , spring-boot-starter-logging 采用 slf4j+logback
springboot 也能自动配置其他框架
日志的抽象层 | 日志的实现类 |
---|---|
JUL, SLF4J, Jboss-logging | Log4j, JUL, Log4J2, Logback |
抽象层选择 slf4j , 日志实现选择 LogBack
Slf4j 使用
1. 如何在系统中使用slf4j
上图显示了应用使用slf4j的时候需要的配置,如果实现层使用logback则不需要适配,如果是其他的实现层,则需要中间适配层
每一个日志实现框架都有自己的配置文件,使用slf4j后,配置文件还是使用实现层的配置文件
不同框架中都有各自的日志实现,当我们引入了其他框架的时候,如何统一日志实现
统一系统所有日志框架
1. 将系统中其他日志框架先排除出去
2. 用中间包来替换原有日志框架
3. 导入我们slf4j其他的实现
springboot日志关系
所有springboot项目中都会引入该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
在starter中又依赖了logging, 用它来做日志功能
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.2.6.RELEASE</version>
<scope>compile</scope>
</dependency>
在starter-logging 中 springboot 导入了logback类和其他方法的转换层
接下来实际演示一下如何统一日志实现层
- 定义一个类使用Log4j 打印一句话
public class Dog{
Public Void Bark(){
// 该log 使用 slf4j 抽象类的方法返回 LOG4J 实现类
Logger logger = LoggerFactory.getLogger(Dog.class);
logger.info("汪汪汪")
}
}
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
</dependencies>
- 该工程就是模拟其他引入了非logback的框架,再创建一个工程模拟自身项目调用方法
<dependencies>
// 引入带有log4j的模块
<dependency>
<groupId>com.meiya</groupId>
<artifactId>UseLog4J</artifactId>
<version>1.0-SNAPSHOT</version>
// 1.把log4j排除
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
// 2.引入替换log4j的中间包
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
// 3. 引入需要整合的logback实体类
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
原理分析
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
这个类的实现和log4j一模一样,所以引入的模块自身引入的log4j被排除后,调用的方法就是这个log4j-over-slf4j.jar 包下的内容.而这个jar包里面的实现类又调用了logback的底层实现,所以完成了替换.
ps 如果模块引用的是 slf4j 框架的产品则比较简单
引入slf4j 下的log4j
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
</dependencies>
引入的时候只要把slf4j 的log4j 移除即可直接使用
<dependencies>
<dependency>
<groupId>com.meiya</groupId>
<artifactId>UseLog4J</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>