From 9b3b3538c8c682c41d58bc0ac60a7ae0539adbdb Mon Sep 17 00:00:00 2001 From: zhangjf Date: Fri, 20 Feb 2026 11:48:09 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20API=E5=93=8D=E5=BA=94=E5=A4=B4=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0traceId=E5=92=8CspanId=EF=BC=8C=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=AE=B0=E5=BD=95spanId=E4=BD=9C=E4=B8=BA=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TraceContextHolder新增SpanId支持(16位短ID) - ContextInterceptor在响应头返回X-Trace-Id和X-Span-Id - 日志格式增加spanId:[traceId][spanId] - JSON日志增加spanId字段用于ELK采集 - 日志输出示例:[abc123][def456] trace info --- .../common/context/TraceContextHolder.java | 68 +++++++++++++++++-- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- .../src/main/resources/logback-spring.xml | 7 +- 10 files changed, 100 insertions(+), 31 deletions(-) diff --git a/fund-common/src/main/java/com/fundplatform/common/context/TraceContextHolder.java b/fund-common/src/main/java/com/fundplatform/common/context/TraceContextHolder.java index c74f46a..1e9f4c8 100644 --- a/fund-common/src/main/java/com/fundplatform/common/context/TraceContextHolder.java +++ b/fund-common/src/main/java/com/fundplatform/common/context/TraceContextHolder.java @@ -5,19 +5,29 @@ import org.slf4j.MDC; import java.util.UUID; /** - * 调用链 TraceId 上下文持有者。 + * 调用链 TraceId 和 SpanId 上下文持有者。 * - *

通过 ThreadLocal 保存当前线程的 TraceId,并同步写入 MDC, - * 方便日志输出时自动带上 traceId,实现 Head 日志追踪能力。

+ *

通过 ThreadLocal 保存当前线程的 TraceId 和 SpanId,并同步写入 MDC, + * 方便日志输出时自动带上 traceId 和 spanId,实现 Head 日志追踪能力。

+ * + * */ public final class TraceContextHolder { private static final ThreadLocal TRACE_ID_HOLDER = new ThreadLocal<>(); + private static final ThreadLocal SPAN_ID_HOLDER = new ThreadLocal<>(); + private static final String MDC_KEY_TRACE_ID = "traceId"; + private static final String MDC_KEY_SPAN_ID = "spanId"; private TraceContextHolder() { } + // ==================== TraceId 操作 ==================== + public static void setTraceId(String traceId) { TRACE_ID_HOLDER.set(traceId); MDC.put(MDC_KEY_TRACE_ID, traceId); @@ -33,14 +43,64 @@ public final class TraceContextHolder { public static String getOrCreateTraceId() { String traceId = TRACE_ID_HOLDER.get(); if (traceId == null || traceId.isEmpty()) { - traceId = UUID.randomUUID().toString().replace("-", ""); + traceId = generateTraceId(); setTraceId(traceId); } return traceId; } + // ==================== SpanId 操作 ==================== + + /** + * 设置 SpanId(当前服务处理标识) + */ + public static void setSpanId(String spanId) { + SPAN_ID_HOLDER.set(spanId); + MDC.put(MDC_KEY_SPAN_ID, spanId); + } + + /** + * 获取当前 SpanId + */ + public static String getSpanId() { + return SPAN_ID_HOLDER.get(); + } + + /** + * 获取当前 SpanId,如不存在则生成一个新的并写入上下文。 + */ + public static String getOrCreateSpanId() { + String spanId = SPAN_ID_HOLDER.get(); + if (spanId == null || spanId.isEmpty()) { + spanId = generateSpanId(); + setSpanId(spanId); + } + return spanId; + } + + // ==================== 工具方法 ==================== + + /** + * 生成 TraceId(32位UUID) + */ + public static String generateTraceId() { + return UUID.randomUUID().toString().replace("-", ""); + } + + /** + * 生成 SpanId(16位短ID) + */ + public static String generateSpanId() { + return UUID.randomUUID().toString().replace("-", "").substring(0, 16); + } + + /** + * 清理上下文 + */ public static void clear() { TRACE_ID_HOLDER.remove(); + SPAN_ID_HOLDER.remove(); MDC.remove(MDC_KEY_TRACE_ID); + MDC.remove(MDC_KEY_SPAN_ID); } } diff --git a/fund-cust/src/main/resources/logback-spring.xml b/fund-cust/src/main/resources/logback-spring.xml index f0b9660..28045b2 100644 --- a/fund-cust/src/main/resources/logback-spring.xml +++ b/fund-cust/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-exp/src/main/resources/logback-spring.xml b/fund-exp/src/main/resources/logback-spring.xml index d57cd22..2968402 100644 --- a/fund-exp/src/main/resources/logback-spring.xml +++ b/fund-exp/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-file/src/main/resources/logback-spring.xml b/fund-file/src/main/resources/logback-spring.xml index bb829b0..5343902 100644 --- a/fund-file/src/main/resources/logback-spring.xml +++ b/fund-file/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-gateway/src/main/resources/logback-spring.xml b/fund-gateway/src/main/resources/logback-spring.xml index cd0ae05..d0a03ce 100644 --- a/fund-gateway/src/main/resources/logback-spring.xml +++ b/fund-gateway/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-proj/src/main/resources/logback-spring.xml b/fund-proj/src/main/resources/logback-spring.xml index edce7e2..8e2ceaa 100644 --- a/fund-proj/src/main/resources/logback-spring.xml +++ b/fund-proj/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-receipt/src/main/resources/logback-spring.xml b/fund-receipt/src/main/resources/logback-spring.xml index 1e7ae6c..070da2c 100644 --- a/fund-receipt/src/main/resources/logback-spring.xml +++ b/fund-receipt/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-report/src/main/resources/logback-spring.xml b/fund-report/src/main/resources/logback-spring.xml index e6c76b0..c1b21a6 100644 --- a/fund-report/src/main/resources/logback-spring.xml +++ b/fund-report/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-req/src/main/resources/logback-spring.xml b/fund-req/src/main/resources/logback-spring.xml index 6be6efe..4c5793f 100644 --- a/fund-req/src/main/resources/logback-spring.xml +++ b/fund-req/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId diff --git a/fund-sys/src/main/resources/logback-spring.xml b/fund-sys/src/main/resources/logback-spring.xml index 901e0d1..a5bc6ee 100644 --- a/fund-sys/src/main/resources/logback-spring.xml +++ b/fund-sys/src/main/resources/logback-spring.xml @@ -8,7 +8,7 @@ - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -17,7 +17,7 @@ ${LOG_PATH}/${APP_NAME}/info.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -38,7 +38,7 @@ ${LOG_PATH}/${APP_NAME}/error.log - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}] %-5level %logger{50} - %msg%n + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{traceId:-}][%X{spanId:-}] %-5level %logger{50} - %msg%n UTF-8 @@ -61,6 +61,7 @@ {"app_name":"${APP_NAME}"} traceId + spanId userId tenantId