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 方法,对指定的配置文件进行监控,并且可以设置检查的间隔时间。
相关推荐
9. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC) 提供了上下文信息,帮助跟踪和分析日志。MDC用于存储固定键值对,NDC则可以堆叠多个诊断信息。 10. **自定义Appender和...
7. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC) 提供了上下文信息,帮助追踪和分析日志。MDC用于存储键值对,NDC则用于存储线程相关的日志信息栈。 8. **自定义日志处理器**...
8. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC) 提供了上下文信息,帮助追踪日志中的关键数据,例如线程ID、请求ID等。 9. **自定义日志记录器**:开发者可以根据需求创建...
3. **MDC和NDC**:SLF4J提供了`Mapped Diagnostic Context`(MDC)和`Nested Diagnostic Context`(NDC)功能,帮助开发者在日志中添加上下文信息。MDC主要用于存储和检索键值对,而NDC则允许按层次结构添加信息,...
8. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和 Nested Diagnostic Context (NDC) 提供了上下文相关的日志信息,例如跟踪请求ID或用户ID。 9. **异常处理**:Log4Net可以方便地记录和处理异常信息,帮助...
- MDC 和 NDC 是两种上下文诊断工具,用于存储线程相关的日志信息,有助于调试和追踪问题。 7. **日志级别与日志策略** - 支持多种日志级别,如DEBUG、INFO、WARN、ERROR和FATAL,可以根据需要调整日志输出的详细...
5. **MDC和NDC**:Log4j提供了Mapped Diagnostic Context (MDC) 和 Nested Diagnostic Context (NDC) 功能,可以存储线程相关的上下文信息,方便日志分析。例如,MDC可以用来存储用户ID,以便追踪特定用户的操作日志...
Mapped Diagnostic Context (MDC)和Nested Diagnostic Context (NDC)是Logback提供的上下文信息管理工具,可帮助追踪请求或事务。MDC是键值对的形式,而NDC则按栈结构存储信息。 **总结** Logback作为强大的日志...
8. **MDC和NDC**:SLF4J支持MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context),这两种上下文信息可以用来跟踪和诊断问题,比如存储线程相关的调试信息。 9. **异常处理**:SLF4J允许直接传递...
5. **MDC和NDC**:SLF4J支持MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context),这两种上下文可以帮助在日志中添加环境相关的数据,如线程ID、请求ID等,以便于调试和追踪。 6. **日志配置**:...
9. **MDC和NDC**:Mapped Diagnostic Context(MDC)和Nested Diagnostic Context(NDC)提供了一种方法,将上下文信息添加到日志消息中,这对于追踪和调试非常有用。 10. **API使用**:在代码中,可以通过`org....
8. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和 Nested Diagnostic Context (NDC) 是Log4j提供的上下文信息存储功能,用于在日志信息中携带额外的调试信息,如请求ID、用户ID等。 总之,Log4j的配置连接是一...
5. **MDC和NDC**:SLF4J支持Mapped Diagnostic Context (MDC)和Nested Diagnostic Context (NDC),这两者可以帮助记录和追踪日志上下文信息,如线程ID、请求ID等。 6. **日志配置**:虽然SLF4J本身不提供配置,但与...
- 异常追踪时,可以使用Mapped Diagnostic Context (MDC)和Nested Diagnostic Context (NDC)存储相关上下文信息,方便调试。 8. **性能优化**: - 为了提高性能,可以启用日志缓冲(`BufferedIO`)和批量写入(`...
5. **MDC和NDC**:Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC) 是SLF4J提供的两种上下文信息管理机制,用于添加和检索线程相关的诊断信息,帮助跟踪和调试问题。 6. **日志配置**:虽然SLF...
- **MDC和NDC**: Mapped Diagnostic Context (MDC) 和 Nested Diagnostic Context (NDC) 提供了存储上下文信息的能力,方便追踪和调试。 ### 5. 学习资源与实践 - **官方文档**: 阅读Apache Log4j的官方文档,了解...
- **MDC和NDC**:提供Mapped Diagnostic Context (MDC) 和Nested Diagnostic Context (NDC) 功能,用于关联上下文信息,帮助定位问题。 4. **最佳实践** - **日志策略**:合理设定日志级别,避免记录过多无用信息...
- MDC和NDC提供上下文信息存储,帮助追踪特定请求或事务的日志。 10. **性能优化** - 使用适当的日志级别,避免在生产环境中开启过多调试日志。 - 合理配置日志文件大小和滚动策略,防止磁盘空间被过度占用。 ...
MDC 和 NDC 提供了一种存储和检索与当前线程相关的诊断信息的方法,常用于添加请求ID或用户ID到日志中,便于追踪问题。 8. **Log4j2** 随着时间的发展,Log4j 推出了更新版本 Log4j2,它引入了许多新特性,如异步...
MDC和NDC是两个辅助工具,用于在日志信息中添加额外的上下文信息。MDC是线程绑定的,适合记录与特定线程相关的数据;NDC则用于记录嵌套调用堆栈的信息。 ### 7. 自定义Appender与Layout 除了预定义的Appender和...