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 日志追踪能力。
+ *
+ *
+ * - traceId: 全链路唯一标识,贯穿整个请求链路
+ * - spanId: 当前服务处理的唯一标识,用于定位具体服务节点
+ *
*/
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