Java 服务端架构
Spring、Netty、日志框架与工程化实战
🎨 视觉封面log4j 清除MDC上下文 MDC分类日志
在项目里需要分类收集处理日志信息,使用log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况,具体来说,就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的。其实,最开始暴露给我们的现象是,在日志清空后,第一次运行任务,会出现两条日志。显然,这个现象更具有迷惑性,让OneCoder一度以为是任务运行了两次。
那么,MDC为什么会出现这个问题呢?简单说,MDC需要在用完后被重置,或者说清空。因为MDC是绑定到线程的,所以,在大多数简单的使用的情况下,例如,在服务端接受请求的入口处,设置一个MDC信息,如果服务端这个处理任务的线程,结束后被丢弃了,那么,也不会出现什么问题。但是如果是一个线程池,池中的线程会被重复利用的情况下,如果你没有结束后清除MDC的信息,那么在下次设置之前,上次设置之后的这段日志,就会出现分类错乱的情况。
解决方法也很简单,在log4j1.2.16以后的版本里,MDC直接提供了clear()方法。即:
MDC.clear()
如果是之前的版本,如果你使用的是slf4j作为接口,那么slf4j也对MDC进行了封装,可以调用slf4j的MDC.clear()方法。
再不然,你也可以自己手动清理MDC。
MDC.getContext().clear();
//当然,需要校验一下MDC.getContext()不为null。
所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI
欢迎加入:C++ GESP/CSP 考级答疑群(688906745) 与 Java/Python交流群(982860385),点击可直接加群。
猜你想读 · 相关文章推荐
log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈
<p 日志是项目中必用的东西,日志产品里最普及应该就是log4j了。(logback这里暂不讨论。) 先看一下常用的log4j的用法,一般来说log4j都会配合slf4j或者common-logging使用,这里已slf4j为例。添加gradle依赖:</p <p 最直接的用法就是在每个需要记录日志的类里,构造一个属于...
自定义实现log4j的appender
log4j,应用最广泛的日志框架。其作者后来推出logback,也是好选择。不多说废话。 log4j组件介绍 Log4j主要有三个组件: Logger:负责供客户端代码调用,执行debug(Object msg)、info(Object msg)、warn(Object msg)、error(Object msg)等方...
log4j自定义appender实现,处理异常堆栈
在项目中需要自定义实现一个log4j的appender。根据log中MDC里的信息,构造日志存储的目录结构。自定义实现log4j appender的方法已经介绍过了。主要是覆盖AppenderSkeleton中的appender方法。 日志内容的获取和格式处理,通过Layout进行格式化 这里有个问题,一般情况下,我们...
OneCoder (lihongzheshuai)
一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com