新增:mdc工具封装
This commit is contained in:
@@ -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";
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
56
common/src/main/java/com/sdm/common/utils/MdcUtil.java
Normal file
56
common/src/main/java/com/sdm/common/utils/MdcUtil.java
Normal 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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user