diff --git a/src/main/java/cn/axzo/pokonyan/filter/RequestLogHandlerInterceptor.java b/src/main/java/cn/axzo/pokonyan/filter/RequestLogHandlerInterceptor.java index 8019e1a..5767943 100644 --- a/src/main/java/cn/axzo/pokonyan/filter/RequestLogHandlerInterceptor.java +++ b/src/main/java/cn/axzo/pokonyan/filter/RequestLogHandlerInterceptor.java @@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; @@ -23,8 +24,9 @@ import java.util.Map; * @author tanjie@axzo.cn * @date 2021/12/13 11:13 */ -@Component @Slf4j +@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) +@Component public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcConfigurer { private static final String SPLIT_EXCLUDE_PARAM = "\\|"; diff --git a/src/main/java/cn/axzo/pokonyan/filter/TraceIdFilter.java b/src/main/java/cn/axzo/pokonyan/filter/TraceIdFilter.java index e779e06..c753062 100644 --- a/src/main/java/cn/axzo/pokonyan/filter/TraceIdFilter.java +++ b/src/main/java/cn/axzo/pokonyan/filter/TraceIdFilter.java @@ -4,10 +4,9 @@ package cn.axzo.pokonyan.filter; import cn.axzo.pokonyan.util.ExceptionUtil; import cn.axzo.pokonyan.wrapper.BodyReaderHttpServletRequestWrapper; import cn.hutool.core.util.StrUtil; -import com.google.common.base.Strings; import lombok.extern.slf4j.Slf4j; -import org.apache.skywalking.apm.toolkit.trace.TraceContext; import org.slf4j.MDC; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -17,19 +16,23 @@ import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; - import java.io.IOException; +import java.util.UUID; /** * @author TanJ * @date 2021/5/24 */ @Slf4j +@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true) @Component @Order(-99999) public class TraceIdFilter extends OncePerRequestFilter { private static final String TRACE_ID = "traceId"; + private static final String CTX_LOG_ID = "ctxLogId"; + private static final String X_REQUEST_ID = "x-request-id"; + @Override @@ -47,21 +50,27 @@ public class TraceIdFilter extends OncePerRequestFilter { //do - filterChain.doFilter(bodyRequest, response); + try { + filterChain.doFilter(bodyRequest, response); + } finally { + MDC.clear(); + } } private void setTraceId(@Nonnull HttpServletRequest request, @Nonnull HttpServletResponse response) { - request.getParameterMap(); - String traceId = request.getHeader(TRACE_ID); - traceId = StrUtil.isBlank(traceId) ? MDC.get(TRACE_ID) : traceId; - //设置SkyWalking - if (Strings.isNullOrEmpty(traceId)) { - MDC.put(TRACE_ID, TraceContext.traceId()); - response.setHeader(TRACE_ID, MDC.get(TRACE_ID)); - } + //header: ctxLogId -> traceId -> x-request-id + String traceId = StrUtil.blankToDefault(request.getHeader(CTX_LOG_ID), + StrUtil.blankToDefault(request.getHeader(TRACE_ID), + request.getHeader(X_REQUEST_ID))); + // blank to new + traceId = StrUtil.blankToDefault(traceId, UUID.randomUUID().toString().replaceAll("-", "")); + //set + MDC.put(TRACE_ID, traceId); + MDC.put(CTX_LOG_ID, traceId); + response.setHeader(TRACE_ID, traceId); } } diff --git a/src/main/java/cn/axzo/pokonyan/util/TraceSupplier.java b/src/main/java/cn/axzo/pokonyan/util/TraceSupplier.java new file mode 100644 index 0000000..eb69dfa --- /dev/null +++ b/src/main/java/cn/axzo/pokonyan/util/TraceSupplier.java @@ -0,0 +1,42 @@ +package cn.axzo.pokonyan.util; + +import org.slf4j.MDC; + +import java.util.function.Supplier; + +/** + * 封装Supplier + * + * @version V1.0 + * @author: ZhanSiHu + * @date: 2023/11/13 15:47 + */ +public class TraceSupplier implements Supplier { + + private static final String CTX_LOG_ID = "ctxLogId"; + + private String traceId; + + private Supplier supplier; + + private TraceSupplier() {} + + + @Override + public T get() { + MDC.put(CTX_LOG_ID, this.traceId); + try { + return supplier.get(); + } finally { + MDC.remove(CTX_LOG_ID); + } + } + + public static TraceSupplier create(Supplier supplier) { + TraceSupplier traceSupplier = new TraceSupplier<>(); + traceSupplier.supplier = supplier; + traceSupplier.traceId = MDC.get(CTX_LOG_ID); + return traceSupplier; + } + +}