Contents
  1. 1. 基本概念

Log4j中的NDC和MDC两个功能类似,都是用于存储上下文的信息。

基本概念

NDC(Nested Diagnostic Context)MDC(Mapped Diagnostic Context)是一种嵌套诊断环境的机制。这种机制的提出,主要为了减少多线程的系统为每个客户单独记录日志的系统开销。就是说在多线程和多并发系统中年,这个模式可以只使用一个logger实例,记录每个线程的日志信息,并且会带上各个线程独特的标识信息。更多的时候这两张机制是作用在一个网络应用上,特别是一个服务平台要同时提过服务给多个客户的时候,需要追踪每个客户的信息并且记录日志的时候,使用客户的唯一标识放入到NDC或者MDC中,从而使得在log信息中更容易查看到哪一个客户触发了log事件。个人理解这个两个功能是存储额外的信息,并且可以在新版本的log4j是用MDCFilter或者NDCFilter来级能进行log文本的过滤。

##NDC与MDC的区别
NDC与MDC的区别在于存储方式的不同。
NDC是使用 栈的机制来存储信息,而MDC使用map的机制来存储信息。所以NDC可以通过%x来进行获取,而MDC需要通过%x{key}来获取

##使用方式
在log的pattern的配置中使用%x来 显示NDC 或者MDC信息。
在代码中设定NDC或者MDC必须在调用logger的记录方法之前,而且要保证在退出当前环境(当前代码段)的时候将信息移除,以免造成内存溢出
……
NDC.push(message);
……
logger.info();
NDC.pop();
……
NDC.remove();//在结束当前线程执行的时候要调用这个方法

使用MDC的方式大致相同,只不过是需要提供key来作为信息的映射。
……
MDC.put(key,message);
……
logger.infog();
……
MDC.remove(key);

Contents
  1. 1. 基本概念