OneCoder Avatar
OneCodercoderli.com · 955 篇博文
{ } Java

Java 服务端架构

Spring、Netty、日志框架与工程化实战

🎨 视觉封面

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

📅 2013-11-20·✍️ onecoder·计算中...·⏱️ 2 分钟
#Log4j

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

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

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

JAVA
MDC.clear()

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

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

JAVA
MDC.getContext().clear();
//当然,需要校验一下MDC.getContext()不为null。
💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

💬 读者留言与交流

0 条讨论
✨ 支持 Markdown 语法格式
还没有留言,快来成为第一个讨论者吧!