映射调试上下文MDC

1.简介

MDC 介绍​ MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。 简而言之,MDC就是日志框架提供的一个InheritableThreadLocal,项目代码中可以将键值对放入其中,然后使用指定方式取出打印即可。

原理:当请求来时生成一个traceId放在InheritableThreadLocal里,然后打印时去取就行了。但在不改动原有输出语句的前提下自然需要日志框架的支持了。

2.使用

2.1配置TraceId 过滤器

@Order(1)

@WebFilter(urlPatterns = "/*",filterName = "traceIdFilter")
public class TraceIdFilter implements Filter {

    public final static String MDC_TRACE_ID = "traceId";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String traceId = httpRequest.getHeader(MDC_TRACE_ID);
        if (StringUtils.isBlank(traceId)) {
            traceId = IdUtil.fastSimpleUUID();;
        }
        MDC.put(MDC_TRACE_ID, traceId);

        chain.doFilter(request, response);
    }
}

 2.2 启动类开启

@SpringBootApplication

@ServletComponentScan
public class OpenApp {
    public static void main(String[] args) {
        SpringApplication.run(OpenApp.class, args);
    }

}

2.3 配置文件配置日志输出格式

# Spring Boot 日志配置
logging:
  # 控制台日志输出格式
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(%-5level) %clr([%X{traceId}]) %clr(${PID:-}) --- %clr(%logger{50}) - %m%n"

# 注释说明:
# %d{yyyy-MM-dd HH:mm:ss.SSS}: 时间戳,格式为年-月-日 时:分:秒:毫秒
# %-5level: 日志级别,左对齐且至少占用5个字符宽度
# %clr(...): 使用颜色编码(如果支持)
# [%X{traceId}]: Mapped Diagnostic Context中的traceId,用于记录跟踪请求的唯一标识
# ${PID:-}: 当前进程ID,如果没有则显示空字符串
# ---: 分隔符
# %logger{50}: 日志器名称,最多显示50个字符
# %m: 日志消息内容
# %n: 换行符

 

相关推荐

  1. 【第5章】spring-mvc请求映射处理

    2024-04-21 22:48:03       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 22:48:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 22:48:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 22:48:03       87 阅读
  4. Python语言-面向对象

    2024-04-21 22:48:03       96 阅读

热门阅读

  1. 持续集成和持续部署

    2024-04-21 22:48:03       39 阅读
  2. VOJ 扑克牌 题解 01背包dp

    2024-04-21 22:48:03       36 阅读
  3. linux tar解压缩命令

    2024-04-21 22:48:03       39 阅读
  4. 设计模式-工厂模式

    2024-04-21 22:48:03       29 阅读
  5. docker安装ubuntu桌面端

    2024-04-21 22:48:03       35 阅读
  6. 模拟器无法ADB链接的所有情况及解决方案

    2024-04-21 22:48:03       32 阅读
  7. Electron桌面应用开发:从入门到发布全流程解析

    2024-04-21 22:48:03       39 阅读
  8. 关于ContentProvider这一遍就够了

    2024-04-21 22:48:03       36 阅读
  9. 汽车网络安全 -- ECU会遭受黑客怎样的攻击?

    2024-04-21 22:48:03       34 阅读