文章

log4j 清除MDC上下文 MDC分类日志

在项目里需要分类收集处理日志信息,使用log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况,具体来说,就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的。其实,最开始暴露给我们的现象是,在日志清空后,第一次运行任务,会出现两条日志。显然,这个现象更具有迷惑性,让OneCoder一度以为是任务运行了两次。

那么,MDC为什么会出现这个问题呢?简单说,MDC需要在用完后被重置,或者说清空。因为MDC是绑定到线程的,所以,在大多数简单的使用的情况下,例如,在服务端接受请求的入口处,设置一个MDC信息,如果服务端这个处理任务的线程,结束后被丢弃了,那么,也不会出现什么问题。但是如果是一个线程池,池中的线程会被重复利用的情况下,如果你没有结束后清除MDC的信息,那么在下次设置之前,上次设置之后的这段日志,就会出现分类错乱的情况。

解决方法也很简单,在log4j1.2.16以后的版本里,MDC直接提供了clear()方法。即:

1
MDC.clear()

如果是之前的版本,如果你使用的是slf4j作为接口,那么slf4j也对MDC进行了封装,可以调用slf4j的MDC.clear()方法。

再不然,你也可以自己手动清理MDC。

1
2
MDC.getContext().clear();
//当然,需要校验一下MDC.getContext()不为null。
本文由作者按照 CC BY 4.0 进行授权