`
zhanglm
  • 浏览: 76218 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

log4j的MDC

    博客分类:
  • java
阅读更多

org.apache.log4j 
Class MDC

java.lang.Object
  extended by org.apache.log4j.MDC

public class MDC
extends java.lang.Object

The MDC class is similar to the NDC class except that it is based on a map instead of a stack. It provides mapped diagnostic contexts. A Mapped Diagnostic Context, or MDC in short, is an instrument for distinguishing interleaved log output from different sources. Log output is typically interleaved when a server handles multiple clients near-simultaneously.

The MDC is managed on a per thread basis. A child thread automatically inherits a copy of the mapped diagnostic context of its parent.

The MDC class requires JDK 1.2 or above. Under JDK 1.1 the MDC will always return empty values but otherwise will not affect or harm your application.

 

 

Since:
1.2



NDCMDC

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

 

NDC采用了一个类似栈的机制来pushpop上下文信息,每一个线程都独立地储存上下文信息。比如说一个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及以前的版本中DOMConfiguratorPropertyConfigurator都提供了configureAndWatch方法,对指定的配置文件进行监控,并且可以设置检查的间隔时间。


分享到:
评论
4 楼 kylewebgame 2012-11-02  
请问有无更详细的使用例子?
3 楼 lees 2012-02-01  
mark一下
2 楼 nauhk 2011-02-11  
好,mark下
1 楼 lnfszl 2010-08-14  






相关推荐

    java-日志-log4j.7z

    此外,Log4j还支持MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context),这些特性可以附加上下文信息到日志记录中,对于调试多线程和分布式系统非常有用。 如果你对Log4j的具体使用还有疑问,可以...

    LOG4J2 mdc配置

    LOG4J2的生产环境配置配置案例: 4.日志滚动,避免单个日志过大,可以按小时进行日志分割. <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/app-%d{MM-dd-yyyy}.log.gz" ignoreExceptions=...

    log4j-API-最新稳定版本log4j-1.2.17

    标题提及的是"log4j-API-最新稳定版本log4j-1.2.17",这表明我们关注的是日志框架Log4j的一个特定版本,即1.2.17。Log4j是Apache软件基金会开发的一个用于Java应用程序的日志记录工具,它提供了灵活的日志记录功能,...

    log4j简单使用

    - `log4j-1.2.14.jar`: 这是Log4j 1.2.14版本的jar包,包含了Log4j的全部类和方法,是使用Log4j进行日志记录的核心组件。 - `commons-logging-1.0.4.jar`: 这是Apache Commons Logging库,它是Java日志API的一个抽象...

    log4j jarjar包

    在Java项目中,引入log4j-1.2.16.jar这个jar包后,我们首先需要配置log4j的属性文件(通常为log4j.properties或log4j.xml)。配置文件中,我们可以设定日志器的级别、Appender类型及输出格式等。 例如,以下是一个...

    log4j日志配置以及配置文件详解

    **日志系统在软件开发中扮演着至关重要的角色,它能帮助开发者跟踪程序运行...同时,不断学习和探索log4j的高级特性,如异步日志、MDC(Mapped Diagnostic Context)等,可以进一步提升日志系统的实用性和可维护性。

    Log4J完整说明和配置

    ### Log4J完整说明与配置解析 #### 一、Log4J简介 Log4J是Apache的一个开源项目,用于提供灵活的...此外,Log4J还提供了丰富的扩展机制,如MDC(Mapped Diagnostic Context)等功能,进一步增强了其灵活性和适应性。

    log4j多个简单实例

    MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)是Log4j提供的上下文诊断工具。它们可以用来存储与线程相关的诊断信息,便于在复杂环境中追踪问题。 通过以上实例,你已经了解了Log4j的基本...

    apache-log4j-2.4.1-bin.zip

    Apache Log4j 2是Java世界中广泛使用的日志记录框架之一,它的最新版本为2.4.1。Log4j 2相比其前身Log4j 1.x,提供了许多改进和新特性,使得它在性能、可配置性、可扩展性和稳定性方面有了显著提升。在本文中,我们...

    log4j-slf4j-impl.zip

    5. **MDC与NDC**:Log4j-SLF4J-Impl支持Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC),为日志信息添加上下文信息,有助于追踪和诊断问题。 四、集成与使用 集成Log4j-SLF4J-Impl通常涉及...

    log4j 源码包 日志包 2.11.0

    《深入解析Log4j 2.11.0源码》 Log4j,作为Java领域最常用的日志框架之一,其2.11.0版本的发布为开发者提供了更加强大、高效和灵活的日志处理能力。源码包的获取,对于开发者深入理解其工作原理、定制化需求以及...

    apache-log4j-2.0-rc1-src

    Apache Log4j是Java平台上的一个著名日志记录框架,其2.0版本的重大更新带来了许多性能提升和功能增强。Log4j 2.0 RC1(Release Candidate 1)是该系列的一个候选版本,意味着它在正式发布之前用于测试和反馈。这个...

    log4j生成带时间戳的日志文件(包括extras包以及简单demo)

    Log4j extras包是Log4j的一个扩展,提供了更多功能,如MDC(Mapped Diagnostic Context)、NDC(Nested Diagnostic Context)等。这些功能可以帮助开发者更好地管理日志上下文,尤其在多线程环境中非常有用。例如,...

    log4j2 -2.11.1.zip

    Log4j2是Java日志记录框架的著名组件,它为开发者提供了强大的日志管理和分析功能。这个"Log4j2-2.11.1.zip"压缩包包含了该框架的2.11.1版本,这是一个稳定且广泛使用的版本。在本篇中,我们将深入探讨Log4j2的核心...

    log4j-2.11.1.jar

    《Apache Log4j 2.11.1:Java日志框架的核心组件》 Apache Log4j 是一个广泛使用的开源日志记录框架,为Java应用程序提供了强大的日志处理能力。在2.11.1这个版本中,Log4j 继续提供高效、灵活的日志记录解决方案,...

    log4j2必需jar包

    log4j-core包含了许多功能,如异步日志记录以提高性能,丰富的Appender(例如控制台、文件、数据库、SMTP、HTTP等),Layouts(JSON、XML、Pattern、Gelf等),过滤器(基于日志级别、MDC、自定义条件等),以及...

    log4j-1.2.17含源码

    此外,Log4j 1.2.17还支持MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context),这两个功能提供了上下文信息,帮助追踪问题。MDC是线程绑定的,而NDC可以嵌套,两者在调试多线程和复杂系统时特别...

    Log4j2 web demo (log4j2 version 2.1)

    Log4j2允许你基于MDC(Mapped Diagnostic Context)或NDC(Nested Diagnostic Context)进行日志过滤。例如,你可以添加一个MDC键值对来区分不同的用户请求: ```java MDC.put("userId", "123456"); // 记录日志 ...

    log4j-1.2.17

    《深入理解log4j-1.2.17:构建高效日志系统的关键》 在IT行业中,日志记录是至关重要的,它为系统监控、故障排查和性能优化提供了宝贵的线索。Apache Log4j作为Java领域中最广泛使用的日志框架之一,其1.2.17版本...

Global site tag (gtag.js) - Google Analytics