package com.example.logging; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import org.slf4j.MDC; public class LoggingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String traceId = extractOrGenerate(req); try { MDC.put("traceId", traceId); MDC.put("uri", req.getRequestURI()); // 如果能从认证/上下文拿到 userId,填入 MDC String userId = req.getHeader("X-User-Id"); if (userId != null) MDC.put("userId", userId); long start = System.currentTimeMillis(); chain.doFilter(request, response); long duration = System.currentTimeMillis() - start; MDC.put("duration", String.valueOf(duration)); } finally { MDC.remove("traceId"); MDC.remove("uri"); MDC.remove("userId"); MDC.remove("duration"); } } @Override public void destroy() {} private String extractOrGenerate(HttpServletRequest req) { String t = req.getHeader("X-Trace-Id"); if (t != null && !t.isEmpty()) return t; return java.util.UUID.randomUUID().toString(); } }