LoggingFilter.java 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package com.fx.monitor.examples;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletRequest;
  4. import java.io.IOException;
  5. import org.slf4j.MDC;
  6. /**
  7. * 简单的 Servlet Filter 示例:提取/生成 traceId、记录 uri 与 duration 到 MDC。
  8. * 业务需将 MDC 中的字段通过 logback encoder 输出为 JSON 字段。
  9. */
  10. public class LoggingFilter implements Filter {
  11. @Override
  12. public void init(FilterConfig filterConfig) throws ServletException { }
  13. @Override
  14. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  15. HttpServletRequest req = (HttpServletRequest) request;
  16. String traceId = extractOrGenerate(req);
  17. try {
  18. MDC.put("traceId", traceId);
  19. MDC.put("uri", req.getRequestURI());
  20. long start = System.currentTimeMillis();
  21. chain.doFilter(request, response);
  22. long duration = System.currentTimeMillis() - start;
  23. MDC.put("duration", String.valueOf(duration));
  24. } finally {
  25. MDC.remove("traceId");
  26. MDC.remove("uri");
  27. MDC.remove("duration");
  28. }
  29. }
  30. @Override
  31. public void destroy() { }
  32. private String extractOrGenerate(HttpServletRequest req) {
  33. String incoming = req.getHeader("X-Trace-Id");
  34. if (incoming != null && !incoming.isEmpty()) return incoming;
  35. return java.util.UUID.randomUUID().toString();
  36. }
  37. }