MDC 的全称是 映射诊断上下文。它被用来增强应用程序的日志记录功能。这意味着,映射诊断上下文(MDC)提供了一种机制,能够用更多的上下文信息来丰富日志消息,而这些信息在真正需要记录日志的作用域中可能是无法直接获取的。在 Spring WebFlux 中使用 MDC 对于添加上下文信息特别有用,它使得追踪请求流向变得更容易,也能让我们更方便地将日志与特定的请求或会话关联起来。
在本文中,我们将解释如何在 Spring WebFlux 中创建 MDC 日志,并附带一个合适的示例。在这里,我们将使用 Log4j、Logback、SLF4J 等日志框架。这些日志框架允许我们用额外的上下文信息来丰富日志消息。
MDC 的主要特性:
- 上下文日志记录:MDC 允许我们将上下文信息插入到日志中。这对于追踪应用程序中的执行流程特别有用。
- 线程特定的上下文:每个线程都拥有自己的一份上下文映射副本,从而确保上下文数据仅对设置它的线程可见。
- 自动包含在日志中:一旦上下文信息被添加到 MDC 中,它就可以自动包含在日志消息中,而无需修改日志语句本身。
- 动态数据:我们可以在 MDC 中动态地添加、删除或更新键值对,从而允许我们在应用程序执行时更改上下文信息。
- 日志模式配置:通过在日志框架配置中配置日志模式,可以将 MDC 的值包含在日志输出中。
- 易于使用:MDC 的 API 简单易用,通常只涉及放入、获取和移除上下文数据的基本操作。
为了在 Spring WebFlux 中实现自动化 MDC 日志,我们创建了一个 Spring Boot 项目,该项目构建工具使用 Maven,我们在其中使用了以下依赖项。
项目依赖:
org.springframework.boot
spring-boot-starter-webflux
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-starter-test
test
io.projectreactor
reactor-test
test
项目文件夹结构:
步骤 1:
一旦项目成功创建,我们就在资源文件夹中创建了一个名为 log4j2.xml 的配置文件。该文件用于定义日志模式并包含 MDC 信息。您可以在上面的项目文件夹图片中看到这个文件。
XML
CODEBLOCK_49d2ead7
步骤 2:
- 一旦为 MDC 创建了 XML 配置文件。
- 之后,我们使用 @Component 注解创建了一个 MDCFilter 组件类。
- 该类继承自 WebFilter。
- 然后,我们重写了 filter 方法,该方法可以过滤请求。
- 该过滤器会为每个传入的请求生成一个唯一的 requestId,并将其设置在 MDC 中。
Java
CODEBLOCK_01434ed2
步骤 3:
最后,我们使用 Spring 的 @RestController 注解创建了一个名为 MDCController 的 RestController 类。
- 在这个类中,我们定义了 logger