`

org.apache.log4j的MDC和NDC

阅读更多
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方法,对指定的配置文件进行监控,并且可以设置检查的间隔时间。
分享到:
评论

相关推荐

    Log4J完整说明和配置

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

    log4j jarjar包

    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=log/app.log log4j.appender.file.Append=true log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j....

    apache-log4j-1.2

    综上所述,这个"apache-log4j-1.2.15"压缩包包含的Log4j 1.2.15版本提供了全面的日志管理工具,对于理解和维护使用这个版本的Java应用程序非常有价值。不过,考虑到安全性和新功能,现在推荐使用更新的Log4j 2.x版本...

    log4j-1.2.17含源码

    源码分析方面,我们可以关注几个关键类:`org.apache.log4j.Logger`是日志记录的主要接口,`org.apache.log4j.Category`(Logger的实现)负责实际的日志记录,`org.apache.log4j.Appender`接口定义了日志输出的基本...

    log4j-1.2.9.jar

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.appender.File=org.apache.log4j....

    log4j.rar java写LOG日志的驱动

    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender log4j.appender.file.File=logs/app.log log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout....

    apache-log4j-2.4.1-bin.zip

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

    log4j-1.2.17.jar

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.appender.File=org.apache.log4j....

    日志配置到文件,数据库

    - `log4j.addivity.org.apache=true`:这里应该是`log4ity.additivity.org.apache=true`,表示`org.apache`包下的日志记录器会继承根日志记录器的配置。 **2. 控制台输出配置** - `log4j.appender.CONSOLE=org....

    log4j使用实例.zip

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n log4j.appender.File=org.apache.log4j....

    log4j使用例子和文档

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # 配置文件输出 log4j.appender.File=org.apache.log4j....

    Log4j2 web demo (log4j2 version 2.1)

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

    log4j_tutorial.rar_log4j java

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ``` 三、使用Log4j进行日志记录 在Java代码中,我们首先需要...

    log4j入门、详解

    log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # 定义文件输出 log4j.appender.File=org.apache.log4j....

    log4j-1.2.17

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n # 文件输出 log4j.appender.file=org.apache.log4j....

    Log4j配置资料大全

    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.File=/path/to/app.log log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout....

    log4j配置详解与使用方法说明

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ``` - **File Appender**:将日志写入文件。 ```...

    log4j-2.11.1.jar

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

    log4j写日志

    4. **MDC与NDC**: Mapped Diagnostic Context (MDC) 和 Nested Diagnostic Context (NDC) 提供了在日志中添加上下文信息的能力,例如请求ID、用户ID等。 5. **PatternLayout的自定义格式**: 除了预设的转换模式,还...

    手把手教你使用log4j

    log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.Target=System.out log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout....

Global site tag (gtag.js) - Google Analytics