对于每一个开发者来说,查询接口的执行日志都是一个高频率的操作,每当测试说接口有问题时,我们都需要去服务器或者日志系统上查报错的原因。
一般情况下,我们会通过对应的关键字或者接口地址去查询这个接口到底报了什么错,但是这带来一个问题,就是我们可能少打日志或者忘打某些关键字的日志,导致查询记录比较麻烦。

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序设计、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了阳明免费建站欢迎大家使用!
那么有没有一种简单高效的方法,即使我们在日志中不打印任何关键字,系统会自动生成一个关键字,让我们一次性查询出这个接口的所有log记录呢?
MDC
MDC是日志门面框架SLF4J提供的一个类,可以提供在多线程情况下记录日志的功能,log4j、logback、log4j2都有对这个类的实现。
从本质上来说,MDC可以看做一个ThreadLocal,由于其线程安全的特性,可以让我们轻松安全的保存数据。
MDC主要的API有clear()、get()、put()、remove()方法等,简洁的api让我们使用上手基本没有难度。
如何使用
1、修改日志打印格式
以日志框架logback为例,在logback.xml中,找到日志打印规则的配置,添加-%X{reqId}属性,其中reqId可以任意指定,你写其他的属性也可以,博主这里演示指定为reqId。
-%X{reqId} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %file:%line %msg%n
UTF-8
2、添加过滤器MDCFilter
ps.使用拦截器也可以,效果是一样的。对每个接口做拦截。
@Component
@AllArgsConstructor
@Order(Ordered.HIGHEST_PRECEDENCE)
@Slf4j
public class MDCFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
try {
//给每个请求接口生成一个requestId
String requestId = RandomUtil.randomNumbers(10);
//这里的reqId就是上面配置的,要保持一致
MDC.put("reqId", "reqId:" + requestId);
chain.doFilter(request, response);
} finally {
MDC.clear();
}
}
@Override
public void destroy(){
}
}
经过简单的两步就配置好了,下面我们看一下效果。
@PostMapping(value = "/mdcTest")
public ResponseEntity