| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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();
- }
- }
|