1. 新创建一个拦截器
public class TraceContextFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { try { // 填充数据(适用logback、log4j 1.x) MDC.put("traceId", UUID.randomUUID().toString().replace("-","")); // 填充数据(适用log4j 2.x) // ThreadContext.put(Contents.REQUEST_ID, UUID.randomUUID().toString()); filterChain.doFilter(httpServletRequest, httpServletResponse); } finally { // 请求结束时清除数据,否则会造成内存泄露问题 MDC.remove("traceId"); } } }
2. 配置拦截器
@Configuration public class TraceFilterConfig { @Bean public FilterRegistrationBean traceContextFilterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new TraceContextFilter()); filterRegistrationBean.addUrlPatterns("/*"); return filterRegistrationBean; } }
3. 自改日志配置文件logback.xml
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%X{traceId}] [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
4. 日志打印结果