SpringBoo利用 MDC 机制过滤出单次请求相关的日志
import org.slf4j.MDC;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class MDCLoggingFilter implements Filter {
private static final String REQUEST_ID = "requestId";
@Override
public void init(FilterConfig filterConfig) {
// 初始化操作,如果有必要的话
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestId = httpRequest.getHeader(REQUEST_ID);
if (requestId == null) {
requestId = UUID.randomUUID().toString();
}
MDC.put(REQUEST_ID, requestId);
chain.doFilter(request, response);
} finally {
MDC.clear(); // 清理线程关联的日志属性
}
}
@Override
public void destroy() {
// 销毁操作,如果有必要的话
}
}
在这个代码实例中,我们创建了一个名为 MDCLoggingFilter
的 Filter
实现,它将从请求头中提取 requestId
或生成一个新的 requestId
,并将其放入 MDC
中。在请求处理完成后,finally
块会确保清除 MDC
中的日志属性,以防止内存泄漏。这个 Filter
可以被注册为一个 Spring Bean,并在 web.xml
中配置,或者使用 Spring Boot 的自动配置机制。
评论已关闭