Merge branch 'feature/REQ-1359' into pre

This commit is contained in:
zhansihu 2023-11-13 16:31:53 +08:00
commit 6f839c4ad4
3 changed files with 66 additions and 13 deletions

View File

@ -5,6 +5,7 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod; import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
@ -23,8 +24,9 @@ import java.util.Map;
* @author tanjie@axzo.cn * @author tanjie@axzo.cn
* @date 2021/12/13 11:13 * @date 2021/12/13 11:13
*/ */
@Component
@Slf4j @Slf4j
@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true)
@Component
public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcConfigurer { public class RequestLogHandlerInterceptor implements HandlerInterceptor, WebMvcConfigurer {
private static final String SPLIT_EXCLUDE_PARAM = "\\|"; private static final String SPLIT_EXCLUDE_PARAM = "\\|";

View File

@ -4,10 +4,9 @@ package cn.axzo.pokonyan.filter;
import cn.axzo.pokonyan.util.ExceptionUtil; import cn.axzo.pokonyan.util.ExceptionUtil;
import cn.axzo.pokonyan.wrapper.BodyReaderHttpServletRequestWrapper; import cn.axzo.pokonyan.wrapper.BodyReaderHttpServletRequestWrapper;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;
import org.slf4j.MDC; import org.slf4j.MDC;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
@ -17,19 +16,23 @@ import javax.servlet.FilterChain;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.util.UUID;
/** /**
* @author TanJ * @author TanJ
* @date 2021/5/24 * @date 2021/5/24
*/ */
@Slf4j @Slf4j
@ConditionalOnProperty(prefix = "axzo.log.pokonya", name = "enable", havingValue = "true", matchIfMissing = true)
@Component @Component
@Order(-99999) @Order(-99999)
public class TraceIdFilter extends OncePerRequestFilter { public class TraceIdFilter extends OncePerRequestFilter {
private static final String TRACE_ID = "traceId"; 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 @Override
@ -47,21 +50,27 @@ public class TraceIdFilter extends OncePerRequestFilter {
//do //do
filterChain.doFilter(bodyRequest, response); try {
filterChain.doFilter(bodyRequest, response);
} finally {
MDC.clear();
}
} }
private void setTraceId(@Nonnull HttpServletRequest request, private void setTraceId(@Nonnull HttpServletRequest request,
@Nonnull HttpServletResponse response) { @Nonnull HttpServletResponse response) {
request.getParameterMap(); //header: ctxLogId -> traceId -> x-request-id
String traceId = request.getHeader(TRACE_ID); String traceId = StrUtil.blankToDefault(request.getHeader(CTX_LOG_ID),
traceId = StrUtil.isBlank(traceId) ? MDC.get(TRACE_ID) : traceId; StrUtil.blankToDefault(request.getHeader(TRACE_ID),
//设置SkyWalking request.getHeader(X_REQUEST_ID)));
if (Strings.isNullOrEmpty(traceId)) { // blank to new
MDC.put(TRACE_ID, TraceContext.traceId()); traceId = StrUtil.blankToDefault(traceId, UUID.randomUUID().toString().replaceAll("-", ""));
response.setHeader(TRACE_ID, MDC.get(TRACE_ID)); //set
} MDC.put(TRACE_ID, traceId);
MDC.put(CTX_LOG_ID, traceId);
response.setHeader(TRACE_ID, traceId);
} }
} }

View File

@ -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<T> implements Supplier<T> {
private static final String CTX_LOG_ID = "ctxLogId";
private String traceId;
private Supplier<T> 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 <T> TraceSupplier<T> create(Supplier<T> supplier) {
TraceSupplier<T> traceSupplier = new TraceSupplier<>();
traceSupplier.supplier = supplier;
traceSupplier.traceId = MDC.get(CTX_LOG_ID);
return traceSupplier;
}
}