新增:mdc工具封装

This commit is contained in:
2026-01-28 19:19:45 +08:00
parent 87597670c2
commit 4393d4d87f
5 changed files with 131 additions and 38 deletions

View File

@@ -0,0 +1,18 @@
package com.sdm.common.common;
/*spdm 常量字符串定义类 */
public class SpdmCommonConstant {
/**
* MDC 中存储 traceId 的 key需与日志格式中的 %X{traceId} 对应)
*/
public static final String TRACE_ID_KEY = "traceId";
/**
* 响应头中返回 traceId 的 key前端可通过此 key 获取)
*/
public static final String TRACE_ID_HEADER = "X-Trace-Id";
}

View File

@@ -1,5 +1,6 @@
package com.sdm.common.filter;
import com.sdm.common.common.SpdmCommonConstant;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -13,15 +14,7 @@ import java.util.UUID;
// 拦截所有 HTTP 请求
public class TraceIdFilter implements Filter {
/**
* MDC 中存储 traceId 的 key需与日志格式中的 %X{traceId} 对应)
*/
public static final String TRACE_ID_KEY = "traceId";
/**
* 响应头中返回 traceId 的 key前端可通过此 key 获取)
*/
public static final String TRACE_ID_HEADER = "X-Trace-Id";
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
@@ -32,14 +25,14 @@ public class TraceIdFilter implements Filter {
try {
// 1. 生成或获取 traceId优先从请求头获取支持前端传递便于联调
String traceId = request.getHeader(TRACE_ID_HEADER);
String traceId = request.getHeader(SpdmCommonConstant.TRACE_ID_HEADER);
if (traceId == null || traceId.trim().isEmpty()) {
// 生成 UUID 并去除横杠32位简洁易读
traceId = UUID.randomUUID().toString().replace("-", "");
}
// 2. 存入 MDC供日志打印使用所有日志框架可通过 %X{traceId} 获取)
MDC.put(TRACE_ID_KEY, traceId);
MDC.put(SpdmCommonConstant.TRACE_ID_KEY, traceId);
// 3. 写入响应头(返回给前端,便于前端排查问题时匹配日志)
// response.setHeader(TRACE_ID_HEADER, traceId);
@@ -49,7 +42,7 @@ public class TraceIdFilter implements Filter {
} finally {
// 5. 清除 MDC 中的 traceId关键避免线程池复用导致的 traceId 污染)
MDC.remove(TRACE_ID_KEY);
MDC.remove(SpdmCommonConstant.TRACE_ID_KEY);
}
}

View File

@@ -0,0 +1,56 @@
package com.sdm.common.utils;
import com.sdm.common.common.SpdmCommonConstant;
import org.slf4j.MDC;
import java.util.UUID;
public class MdcUtil {
/**
* 私有构造方法,禁止实例化工具类
*/
private MdcUtil() {
throw new UnsupportedOperationException("工具类禁止实例化");
}
/**
* 生成并存入 traceId 到 MDC
* @return 生成的 traceId 字符串无横线的UUID
*/
public static String generateAndPutTraceId() {
// 生成无横线的UUID作为traceId
String traceId = UUID.randomUUID().toString().replace("-", "");
// 存入MDC供日志框架通过 %X{traceId} 获取
MDC.put(SpdmCommonConstant.TRACE_ID_KEY, traceId);
return traceId;
}
/**
* 从 MDC 中移除 traceId销毁
*/
public static void removeTraceId() {
MDC.remove(SpdmCommonConstant.TRACE_ID_KEY);
}
/**
* 获取当前 MDC 中的 traceId
* @return 当前traceId若不存在则返回null
*/
public static String getTraceId() {
return MDC.get(SpdmCommonConstant.TRACE_ID_KEY);
}
/**
* 手动存入指定的 traceId 到 MDC适用于需要复用traceId的场景如跨服务调用
* @param traceId 自定义的traceId
*/
public static void putTraceId(String traceId) {
if (traceId == null || traceId.trim().isEmpty()) {
throw new IllegalArgumentException("traceId 不能为空");
}
MDC.put(SpdmCommonConstant.TRACE_ID_KEY, traceId);
}
}