SpringBoot 源码深度解析
第四章 springBoot 日志管理文章目录
前言
这一章主要介绍springBoot 日志管理
一、日志框架介绍
在项目的开发中,日志是必不可少的一个记录事件的组件,不管是记录运行情况还是追踪线上问题,都离不开对日志的分析,所以也会相应的在项目中实现和构建我们所需要的日志框架。
而市面上常见的日志框架有很多,比如:JCL、SLF4J、Jboss-logging、jUL、log4j、log4j2、logback
等等,我们该如何选择呢?
通常情况下,日志是由一个抽象层+实现层的组合来搭建的。
Spring
框架选择使用了 JCL
作为默认日志输出。而 Spring Boot
默认选择了 SLF4J
结合 LogBack
二、SLF4J 的使用
在开发的时候不应该直接使用日志实现类,应该使用日志的抽象层。具体参考 SLF4J
官方。 SLF4J
官方给出了简单示例。
首先要为系统导入 SLF4J
的 jar
.
下图是 SLF4J
结合各种日志框架的官方示例,从图中可以清晰的看出 SLF4J API
永远作为日志的门面,直接应用与应用程序中。
注意:由于每一个日志的实现框架都有自己的配置文件,所以在使用 SLF4j
之后,配置文件还是要使用实现日志框架的配置文件。
三、统一日志框架的使用
一般情况下,在项目中存在着各种不同的第三方 jar
,且它们的日志选择也可能不尽相同,显然这样是不利于我们使用的,那么如果我们想为项目设置统一的日志框架该怎么办呢?
- 排除系统中的其他日志框架。
- 使用中间包替换要替换的日志框架。
- 导入我们选择的 SLF4J 实现。
四、日志框架的使用
Spring Boot
默认已经使用了 SLF4J + LogBack
. 所以我们在不进行任何额外操作的情况下就可以使用 SLF4J + Logback
进行日志输出。
编写 Java 测试类进行测试。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* 测试日志输出,
* SLF4J 日志级别从小到大trace,debug,info,warn,error
**/
@RunWith(SpringRunner.class)
@SpringBootTest
public class LogbackTest {
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void testLog() {
logger.trace("Trace 日志...");
logger.debug("Debug 日志...");
logger.info("Info 日志...");
logger.warn("Warn 日志...");
logger.error("Error 日志...");
}
}
已知日志级别从小到大为 trace < debug < info < warn < error
. 运行得到输出如下。由此可见 Spring Boot
默认日志级别为 INFO
.
2020-11-16 19:58:43.094 INFO 39940 — [ main]
com.lagou.Springboot01DemoApplicationTests : Info 日志…
2020-11-16 19:58:43.094 WARN 39940 — [ main]
com.lagou.Springboot01DemoApplicationTests : Warn 日志…
2020-11-16 19:58:43.094 ERROR 39940 — [ main]
com.lagou.Springboot01DemoApplicationTests : Error 日志…
从上面的日志结合 Logback
日志格式可以知道 Spring Boot
默认日志格式是
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
%d{yyyy-MM-dd HH:mm:ss.SSS} 时间
%thread 线程名称
%-5level 日志级别从左显示5个字符宽度
%logger{50} 类名
%msg%n 日志信息加换行
五、自定义日志输出
可以直接在配置文件编写日志相关配置
# 日志配置
# 指定具体包的日志级别 logging.level.com.lagou=debug
# 控制台和日志文件输出格式 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 日志输出路径,默认文件spring.log logging.file.path=spring.log #logging.file.name=log.log
六、替换日志框架
因为 Log4j 日志框架已经年久失修,原作者都觉得写的不好,所以下面演示替换日志框架为 Log4j2 的方式。根据官网我们 Log4j2
与 logging
需要二选一,因此修改 pom如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId>
</exclusion> </exclusions> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId> </dependency>