Browse Source

feat: 日志增traceId,追踪接口调用链路

master
yinhuaiwei 2 months ago
parent
commit
5c9eef3d53
1 changed files with 21 additions and 16 deletions
  1. +21
    -16
      src/main/java/com/inspect/nvr/config/TraceIdFilter.java

+ 21
- 16
src/main/java/com/inspect/nvr/config/TraceIdFilter.java View File

@ -2,9 +2,12 @@ package com.inspect.nvr.config;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.*;
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;
@ -12,26 +15,28 @@ import java.util.UUID;
* 用于在每个请求中生成或传递traceId方便日志追踪
*/
@Component
public class TraceIdFilter implements Filter {
private static final String TRACE_ID = "traceId";
public class TraceIdFilter extends OncePerRequestFilter {
private static final String TRACE_ID_HEADER = "X-Trace-Id"; // 可从 header 传入支持链路传递
private static final String MDC_KEY = "traceId";
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 1.优先从请求头中获取traceId
String traceId = httpServletRequest.getHeader(TRACE_ID);
// 2.若请求头中没有traceId则生成新的traceId
if (traceId == null || traceId.isEmpty()) {
traceId = generateTraceId();
}
public void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
try {
// 1.优先从请求头中获取traceId
String traceId = request.getHeader(TRACE_ID_HEADER);
// 2.若请求头中没有traceId则生成新的traceId
if (traceId == null || traceId.isEmpty()) {
traceId = generateTraceId();
}
// 3.将traceId放入MDC中
MDC.put(TRACE_ID, traceId);
// 4.继续处理请求
filterChain.doFilter(servletRequest, servletResponse);
MDC.put(MDC_KEY, traceId);
// 4.可响应 header 给下游
response.setHeader(TRACE_ID_HEADER, traceId);
// 5.继续处理请求
filterChain.doFilter(request, response);
} finally {
// 5.处理完成清除MDC中的traceId避免线程复用污染
// 6.处理完成清除MDC中的traceId避免线程复用污染
MDC.clear();
}
}


Loading…
Cancel
Save