package com.fx.monitor.examples; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import org.slf4j.MDC; /** * 简单的 Servlet Filter 示例:提取/生成 traceId、记录 uri 与 duration 到 MDC。 * 业务需将 MDC 中的字段通过 logback encoder 输出为 JSON 字段。 */ 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()); 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("duration"); } } @Override public void destroy() { } private String extractOrGenerate(HttpServletRequest req) { String incoming = req.getHeader("X-Trace-Id"); if (incoming != null && !incoming.isEmpty()) return incoming; return java.util.UUID.randomUUID().toString(); } }