diff --git a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/DubboTraceFilter.java b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/DubboTraceFilter.java index 2f8214a7a5c5c4292300918171b829b9fb5d2d8a..1cd42cdf786c5d7b0c6a85f6ac3e4640f733307f 100644 --- a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/DubboTraceFilter.java +++ b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/DubboTraceFilter.java @@ -34,9 +34,8 @@ public class DubboTraceFilter implements Filter { } else { //服务消费者逻辑 String traceId = MDCTraceUtils.getTraceId(); if (StrUtil.isNotEmpty(traceId)) { - String spanId = MDCTraceUtils.getSpanId(); invocation.setAttachment(MDCTraceUtils.KEY_TRACE_ID, traceId); - invocation.setAttachment(MDCTraceUtils.KEY_SPAN_ID, spanId); + invocation.setAttachment(MDCTraceUtils.KEY_SPAN_ID, MDCTraceUtils.getNextSpanId()); } } try { diff --git a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/FeignTraceConfig.java b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/FeignTraceConfig.java index d35bccf0093c1f53f00628dffe5e51842e9b6818..d5a0d1e454cd6bd5227341ec206dda0b8444e4fd 100644 --- a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/FeignTraceConfig.java +++ b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/FeignTraceConfig.java @@ -1,11 +1,11 @@ package com.central.log.trace; +import cn.hutool.core.util.StrUtil; import com.central.log.properties.TraceProperties; import feign.RequestInterceptor; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.util.StringUtils; import javax.annotation.Resource; @@ -30,10 +30,9 @@ public class FeignTraceConfig { if (traceProperties.getEnable()) { //传递日志traceId String traceId = MDCTraceUtils.getTraceId(); - if (!StringUtils.isEmpty(traceId)) { - String spanId = MDCTraceUtils.getSpanId(); + if (StrUtil.isNotEmpty(traceId)) { template.header(MDCTraceUtils.TRACE_ID_HEADER, traceId); - template.header(MDCTraceUtils.SPAN_ID_HEADER, spanId); + template.header(MDCTraceUtils.SPAN_ID_HEADER, MDCTraceUtils.getNextSpanId()); } } }; diff --git a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/MDCTraceUtils.java b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/MDCTraceUtils.java index 6948a4a380e7b485aa4ca63e614a7b24c1861e69..0c5ccf29a221ce84b44ac75575f3fe6c7fe2d826 100644 --- a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/MDCTraceUtils.java +++ b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/MDCTraceUtils.java @@ -1,10 +1,11 @@ package com.central.log.trace; import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.ttl.TransmittableThreadLocal; import org.slf4j.MDC; -import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; /** * 日志追踪工具类 @@ -47,13 +48,16 @@ public class MDCTraceUtils { */ public static final int FILTER_ORDER = -1; + private static final TransmittableThreadLocal spanNumber = new TransmittableThreadLocal<>(); + /** * 创建traceId并赋值MDC */ public static void addTrace() { String traceId = createTraceId(); MDC.put(KEY_TRACE_ID, traceId); - MDC.put(KEY_SPAN_ID, traceId); + MDC.put(KEY_SPAN_ID, "0"); + initSpanNumber(); } /** @@ -61,8 +65,8 @@ public class MDCTraceUtils { */ public static void putTrace(String traceId, String spanId) { MDC.put(KEY_TRACE_ID, traceId); - MDC.put(KEY_PARENT_ID, spanId); - MDC.put(KEY_SPAN_ID, createTraceId()); + MDC.put(KEY_SPAN_ID, spanId); + initSpanNumber(); } /** @@ -84,13 +88,21 @@ public class MDCTraceUtils { public static void removeTrace() { MDC.remove(KEY_TRACE_ID); MDC.remove(KEY_SPAN_ID); - MDC.remove(KEY_PARENT_ID); + spanNumber.remove(); } /** * 创建traceId */ public static String createTraceId() { - return RandomUtil.randomString(16); + return IdUtil.getSnowflake().nextIdStr(); + } + + public static String getNextSpanId() { + return StrUtil.format("{}.{}", getSpanId(), spanNumber.get().incrementAndGet()); + } + + private static void initSpanNumber() { + spanNumber.set(new AtomicInteger(0)); } } diff --git a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/WebTraceFilter.java b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/WebTraceFilter.java index 96cba4675171f4af1b3b17e4e0a131a34a9624f6..c7415f3e3f8f645baaf7a86f877e5ea54babd24f 100644 --- a/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/WebTraceFilter.java +++ b/zlt-commons/zlt-log-spring-boot-starter/src/main/java/com/central/log/trace/WebTraceFilter.java @@ -1,10 +1,10 @@ package com.central.log.trace; +import cn.hutool.core.util.StrUtil; import com.central.log.properties.TraceProperties; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import org.springframework.web.filter.OncePerRequestFilter; import javax.annotation.Resource; @@ -41,7 +41,7 @@ public class WebTraceFilter extends OncePerRequestFilter { try { String traceId = request.getHeader(MDCTraceUtils.TRACE_ID_HEADER); String spanId = request.getHeader(MDCTraceUtils.SPAN_ID_HEADER); - if (StringUtils.isEmpty(traceId)) { + if (StrUtil.isEmpty(traceId)) { MDCTraceUtils.addTrace(); } else { MDCTraceUtils.putTrace(traceId, spanId); diff --git a/zlt-commons/zlt-log-spring-boot-starter/src/main/resources/logback-spring.xml b/zlt-commons/zlt-log-spring-boot-starter/src/main/resources/logback-spring.xml index ca50eaf288ad424800c5fd946e3c42fe19fc3701..3fe98f07cf2af0019de979207f653e71ae1f82fa 100644 --- a/zlt-commons/zlt-log-spring-boot-starter/src/main/resources/logback-spring.xml +++ b/zlt-commons/zlt-log-spring-boot-starter/src/main/resources/logback-spring.xml @@ -18,8 +18,8 @@ - + value="[${APP_NAME}:${ServerIP}:${ServerPort}] %clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%X{traceId}-%X{spanId}]){yellow} %clr([%thread]){orange} %clr(%-40.40logger{39}){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}" /> + diff --git a/zlt-gateway/sc-gateway/src/main/java/com/central/gateway/filter/TraceFilter.java b/zlt-gateway/sc-gateway/src/main/java/com/central/gateway/filter/TraceFilter.java index fc1f3d3e5ffa6d15bc4fcc46b95f7c6f852154c0..89bf0f0b27d92f1c0c5c03a081ee092606fd2324 100644 --- a/zlt-gateway/sc-gateway/src/main/java/com/central/gateway/filter/TraceFilter.java +++ b/zlt-gateway/sc-gateway/src/main/java/com/central/gateway/filter/TraceFilter.java @@ -34,7 +34,7 @@ public class TraceFilter implements GlobalFilter, Ordered { ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate() .headers(h -> { h.add(MDCTraceUtils.TRACE_ID_HEADER, MDCTraceUtils.getTraceId()); - h.add(MDCTraceUtils.SPAN_ID_HEADER, MDCTraceUtils.getSpanId()); + h.add(MDCTraceUtils.SPAN_ID_HEADER, MDCTraceUtils.getNextSpanId()); }) .build();