`
yanfeijun
  • 浏览: 26294 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

log4j中的NDC和MDC

阅读更多

这几天,闲暇下来回头看了一下log4j,在看PatternLayout的各个字符的含义的时候,看见了这两个

x 	Used to output the NDC (nested diagnostic context) associated with the thread that generated the logging event. 
 
X 	

Used to output the MDC (mapped diagnostic context) associated with the thread that generated the logging event. The X conversion character must be followed by the key for the map placed between braces, as in %X{clientNumber} where clientNumber is the key. The value in the MDC corresponding to the key will be output.

See MDC class for more details. 
 

不懂啥叫NDC,啥叫MDC,google之,发现http://www.ibm.com/developerworks/cn/web/wa-lo-usertrack/

 

 

写道
NDC(Nested Diagnostic Context)是 Neil Harrison 在名为《Patterns for Logging Diagnostic Messages》的书中提出的嵌套诊断环境的机制。这种机制的提出,主要为了减少多线程的系统为每个客户单独记录日志的系统开销。在过去,区分两个客户的日志输出的常用方法是单独为每个客户机实例化新类别,但该方法会增加类别数量,并增加日志记录的管理开销。Neil Harrison 提出的方法就是把用户的上下文信息放到嵌套式诊断环境 (NDC) 中。

NDC 为每一个线程管理一个堆栈。开发人员可以在代码中合适的位置嵌入简单的 push 和 pop 方法,用来维护堆栈。通常 push 进堆栈的是可以唯一标示客户的上下文信息,如 SessionID 或者客户名称,IP 地址等。因为每个客户请求都会有单独的 NDC 堆栈,因此日志系统在输出的时候会根据每个线程找到对应的堆栈,并在输出日志的时候附加上堆栈内的信息。开发人员就可以很容易的在日志中区分出各个不同客户所产生的日志条目。

 简单的说,就是可以为每个唯一标识定义一段信息,可以在在日志中输出

 

MDC和NDC类似,唯一区别就是MDC的每个栈值是一个map,可以在日志输出中,定义自己想输出什么信息:

            MDC.put("first", "1111");
            MDC.put("second", "222");

 log4j配置:

-4r [%t] %-5p %c %x [%X{first}] - %m%n

 就可以输出以first为key的信息.

 

 

看了一下源代码,NDC是使用hashtable来维护每个线程的栈,性能上有点损失的.

 

 

分享到:
评论
1 楼 转转beta 2013-10-11  
MDC和NDC类似,唯一区别就是MDC的每个栈值是一个map,可以在日志输出中,定义自己想输出什么信息:
关于这点,我觉得原文的意思是说MDC是将信息保存在map中,而不是说保存在栈中,栈值为map。可能我的理解有误,但是还是希望能告诉您,如果我理解错了,请通知下我,谢谢

相关推荐

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

    7. **MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)**:这两个特性提供了上下文信息,帮助追踪和调试多线程环境中的问题。 8. **自定义日志等级和日志事件**:开发者可以通过继承`Priority`...

    Log4J完整说明和配置

    在深入分析配置文件之前,我们先了解几个Log4J中的核心概念: - **Logger**:负责接收并处理日志信息的对象。 - **Appender**:指定日志信息的输出目的地。 - **Layout**:定义日志信息的格式。 - **Level**:设置...

    log4j jarjar包

    Log4j,作为Java领域中最流行和广泛使用的日志框架之一,因其强大的功能和灵活性,深受开发者的喜爱。本文将深入探讨Log4j的核心概念,以及如何在项目中使用log4j-1.2.16.jar这个关键的jar包。 一、Log4j简介 Log4...

    log4j简单使用

    8. **MDC (Mapped Diagnostic Context)** 和 **NDC (Nested Diagnostic Context)**: 这两个特性提供了在日志中附加上下文信息的能力,对于跟踪请求、事务或线程很有用。 9. **使用示例**: 在代码中,我们通常会这样...

    java-日志-log4j.7z

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

    log4j中文手册

    Appender在Log4j中是负责将日志输出到目的地的组件。Log4j提供了多种Appender,比如ConsoleAppender用于将日志输出到控制台,FileAppender用于将日志输出到文件,DailyRollingFileAppender用于每天自动滚动写入到...

    apache-log4j-2.4.1-bin.zip

    Apache Log4j 2是Java世界中广泛使用的日志记录框架之一...在实际项目中,你可以根据“apache-log4j-2.4.1-bin.zip”中的内容进行安装和配置,快速地将Log4j 2集成到你的Java应用程序中,享受它带来的便利和性能提升。

    log4j多个简单实例

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

    log4j-1.2.17含源码

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

    log4j-slf4j-impl.zip

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

    log4j-2.11.1.jar

    《Apache Log4j 2.11.1:Java日志框架的核心组件》 Apache Log4j 是一个广泛使用的开源日志记录框架,为Java应用程序提供了强大的日志处理能力。...在实际项目中,正确配置和使用Log4j 2.11.1,将使日志工作事半功倍。

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

    在Log4j中,我们可以自定义日志格式来包含时间戳。例如,在`log4j.properties`配置文件中添加以下内容: ``` log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n ``` ...

    log4j使用例子和文档

    - **MDC(Mapped Diagnostic Context)与NDC(Nested Diagnostic Context)**: 用于存储与线程相关的诊断信息,方便追踪和调试。 总之,Log4j作为一个强大的日志工具,其灵活性和可扩展性使其成为Java开发者首选的...

    Log4j2 web demo (log4j2 version 2.1)

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

    log4j-core-2.7.zip

    描述中提到,Struts2版本2.5.10.1依赖于Log4j2,这意味着开发者在使用该版本的Struts2时,需要引入两个关键的Log4j2库:log4j-api-2.7和log4j-core-2.7。log4j-api-2.7提供了API接口,供应用程序调用,而log4j-core-...

    log4j-1.2.17.jar

    4. **Appender与Layout**:在Log4j中,Appender负责将日志信息输出到特定目的地,而Layout则决定日志信息的格式。常见的Appender有ConsoleAppender(控制台)、FileAppender(文件)和SMTPAppender(电子邮件),...

    log4j入门、详解

    **日志框架Log4j详解** 日志框架在软件开发中扮演着至关重要的角色,它提供了记录应用程序运行过程中的各种事件的功能,...在实际项目中,结合具体需求,合理运用Log4j的各种特性,能极大地提升开发效率和维护体验。

    log4j-1.2.9.jar

    在代码中,我们可以使用以下方式引入和使用Log4j: ```java import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger.getLogger(MyClass.class); public void ...

    The Complete log4j Manual

    此外,手册会涵盖log4j的高级特性,如异步日志记录、自定义日志APPENDER和FILTER,以及MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)的使用,这些特性能帮助我们更好地组织和管理日志信息,...

    log4j.zip和log4j.jar日志文档的处理

    Log4j是Apache组织开发的一款强大的Java日志记录框架,广泛应用于各种Java应用程序中,用于收集、管理和分析应用程序运行过程中的日志信息。这个压缩包`log4j.zip`包含了与Log4j相关的多个资源,旨在帮助用户学习和...

Global site tag (gtag.js) - Google Analytics