log4j中的MDC和NDC

转载 2012年03月29日 15:09:40

NDC和MDC

NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。

 

NDC采用了一个类似栈的机制来push和pop上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存客户端地址等等信息。

当使用的时候,我们要尽可能确保在进入一个context的时候,把相关的信息使用NDC.push(message);在离开这个context的时候使用NDC.pop()将信息删除。另外由于设计上的一些问题,还需要保证在当前thread结束的时候使用NDC.remove()清除内存,否则会产生内存泄漏的问题。

存储了上下文信息之后,我们就可以在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息,下面是一个PatternLayout的例子:

%r [%t] %-5p %c{2} %x - %m%n

使用NDC最重要的好处就是,当我们想输出一些上下文的信息的时候,不需要让logger去寻找这些信息,而只需要在适当的位置进行存储,然后再配置文件中修改PatternLayout。在最新的log4j 1.3版本中增加了一个org.apache.log4j.filters.NDCMatchFilter,用来

根据NDC中存储的信息接受或拒绝一条log信息。

 

MDC和NDC非常相似,所不同的是MDC内部使用了类似map的机制来存储信息,上下文信息也是每个线程独立地储存,所不同的是信息都是以它们的key值存储在”map”中。相对应的方法,MDC.put(key, value); MDC.remove(key); MDC.get(key); 在配置PatternLayout的时候使用:%x{key}来输出对应的value。同样地,MDC也有一个org.apache.log4j.filters.MDCMatchFilter。这里需要注意的一点,MDC是线程独立的,但是一个子线程会自动获得一个父线程MDC的copy。

至于选择NDC还是MDC要看需要存储的上下文信息是堆栈式的还是key/value形式的。

 

动态修改日志配置

在开发过程中,我们经常会遇到修改log4j配置的情况,在这种情况下,频繁重启应用显然是不可接受的。幸好log4j提供了自动重新加载配置文件的能力,在配置文件修改后,便会自己重新加载配置。在1.2及以前的版本中DOMConfigurator和PropertyConfigurator都提供了configureAndWatch方法,对指定的配置文件进行监控,并且可以设置检查的间隔时间。


MDC介绍 -- 一种多线程下日志管理实践方式

一:MDC介绍   MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程序采用多...
  • sunzhenhua0608
  • sunzhenhua0608
  • 2014年06月07日 09:55
  • 18894

使用MDC标注日志上下文

MDC简介log4j 1.x中MDCFilter实现log4j2.0中MDCFilter实现log4j配置中,使用MDC样例代码   MDC简介 MDC[http://l...
  • zheng0518
  • zheng0518
  • 2016年01月29日 23:14
  • 3239

log4j MDC NDC应用场景

NDC(Nested Diagnostic Context)和MDC(Mapped Diagnostic Context)是log4j种非常有用的两个类,它们用于存储应用程序的上下文信息(cont...
  • zhongweijian
  • zhongweijian
  • 2012年06月02日 08:30
  • 10432

Log4j输出格式控制--log4j的PatternLayout参数含义

做项目被log4j的输出格式化参数搞烦了,索性把API的相关部分大致翻译一下,原文参见http://logging.apache.org/log4j/docs/api/org/apache/log4j...
  • guoquanyou
  • guoquanyou
  • 2010年06月23日 16:42
  • 73080

Slf4j MDC 使用和 基于 Logback 的实现分析

前言 如今,在 Java 开发中,日志的打印输出是必不可少的,Slf4j + LogBack 的组合是最通用的方式。 关于 Slf4j 的介绍,请参考本博客http://ketao1989...
  • booooooooooooooooooo
  • booooooooooooooooooo
  • 2015年06月02日 23:21
  • 6029

log(一)——MDC入门

1.MDC是什么 先来一段原版注释, /** * This class hides and serves as a substitute for the underlying logging ...
  • xxcupid
  • xxcupid
  • 2016年07月19日 14:31
  • 836

Log4j MDC使用案例

转自:http://dacoolbaby.iteye.com/blog/2013781 Log4j MDC使用案例   Java代码   import ...
  • tiger0709
  • tiger0709
  • 2017年08月29日 11:23
  • 258

使用MDC标注日志上下文

MDC简介log4j 1.x中MDCFilter实现log4j2.0中MDCFilter实现log4j配置中,使用MDC样例代码   MDC简介 MDC[http://l...
  • zheng0518
  • zheng0518
  • 2016年01月29日 23:14
  • 3239

log4j MDC用户操作日志追踪配置

一:MDC介绍        MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程...
  • userwyh
  • userwyh
  • 2016年10月19日 19:24
  • 6351

MDC介绍 -- 一种多线程下日志管理实践方式

一:MDC介绍   MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程序采用多...
  • sunzhenhua0608
  • sunzhenhua0608
  • 2014年06月07日 09:55
  • 18894
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:log4j中的MDC和NDC
举报原因:
原因补充:

(最多只允许输入30个字)