最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:SpringBoot3.2.5
1. 简介
在项目开发中,为了有效地管理和跟踪每个请求的日志信息对于调试和监控非常重要。SLF4J(Simple Logging Facade for Java)提供了一个统一的日志记录接口,而 MDC(Mapped Diagnostic Context)是 SLF4J 中的一项强大功能,允许我们在日志记录中添加上下文信息。通过在 Spring Boot 中使用 MDC,我们可以实现对每个请求的全链路跟踪。
MDC是SLF4J提供的一个类,我们可以将用户上下文信息放入 MDC(映射诊断上下文),如下是MDC类的方法签名:
public class MDC {
// 将key / value存入当前线程上下文中(ThreadLocal)
public static void put(String key, String val);
// 从当前线程上下文中获取指定的key
public static String get(String key);
// 从当前线程上下文中删除指定的key
public static void remove(String key) ;
// 清空当前线程上下文中的所有数据
public static void clear() ;
}
如需要详细了解该类请查看该类的API文档。
本篇文章将通过以下几方面介绍
快速入门
基于数据库的完整应用案例
跨线程问题(如:使用@Async)
唯一标识traceId统一输出到客户端
内置实用的过滤器
接下来,我们将以结合实际的案例进行详细的简介关于MDC的使用,包括上面的5方面的内容。
2. 快速入门
使用非常的简单,无非就是调用MDC相应的静态方法即可,如下示例:
public class MDCTest {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(MDCTest.class) ;
// 为当前的线程上下文中存入traceXId
MDC.put("traceXId", "xxxooo") ;
logger.info("执行业务操作...") ;
logger.info("业务执行完成") ;
// 使用完后清除
MDC.remove("traceXId") ;
}
}
接下来,我们还需要进行日志的配置(logback.xml)
<configuration scan="true">
<contextName>trace-mdc</contextName>
<!--注意这里的traceXId就是我们往MDC中存入的key了,通过%X{traceXId}获取唯一标识-->
<property name="TRACEX_PATTERN"
value="%green(%d{yyyy-MM-dd HH:mm:ss}) traceId:【%red(%X{traceXId})】 %highlight(%-5level) [%yellow(%thread)] %logger Line:%-3L - %msg%n" />
<appender name="TRACEX" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${TRACEX_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="TRACEX" />
</root>
</configuration>
注意:这里我们使用了 %X 模式,通过该模式输出我们定义在上下文中的数据。
最后,我们运行上面的程序后,你将看到如下的日志信息。
日志中记录显示了,我们设置的traceId,这样一来,我们就能非常清晰的了解到当前业务执行的每一个细节了。
接下来,我们将结合Spring Boot + JPA来个综合的案例。
3. 实战案例
首先,我们先准备如下的基本的数据库查询操作