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中的MDC和NDC,布布扣,bubuko.com

时间: 2024-08-06 00:27:54

log4j中的MDC和NDC的相关文章

LOG4J中日志级别的使用

<logger name="demo-log" additivity="false"> <level value="${log.level}" /> <appender-ref ref="LOG-FILE" /> </logger> LOG4J中分为OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE.ALL或者您定义的级别.Log4j建议仅仅使用四个级别.

log4j中怎样将信息写入到不同的日志文件

log4j中怎样将信息写入到不同的日志文件 有没有想过为什么我们用:Logger logger = Logger.getLogger(ABC.class) ;来得到 logger? 不想只看人家的 demo, demo 毕竟是 Hello World 级别的简单入门样例,我们需要知道 API 是如何描述它们的. Logger.getLogger() 除非用类当参数外还有用字符串当参数的,意思就是说“你可以给你的 Logger 取任意的名字,不是非要使用类名”. 上面这句话是说你可以在log4j.

log4j中isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled的封装

1. log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()作用 项目在应用log4j打印Debug,Info和Trace级别的log时需要加上对应的三个方法进行过滤,代码如下: if (log.isDebugEnabled()) { log.debug(" From: " + req.getFrom().toString() +                   " To: " +

log4j中日志输出文件指定相对路径的方法

我想大多数使用Log4j输出日志到文件系统的朋友可能都碰到过这个问题吧. 那就是在log4j的配置文件中无法指定相对路径,比如如下的配置就会有问题: log4j.appender.E = org.apache.log4j.RollingFileAppender log4j.appender.E.File = ../log/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.append

log4j中Pattern布局ConversionPattern详解

spring使用log4j,可以有2种方法. 1.在web.xml里不做任何配置. log4j.properties放在classpath根目录下, 这时候生成的日志文件就没有相对路径,如果写相对路径,则会生成在安装tomcat的根路径下. 2.在web.xml设置. <context-param>           <param-name>log4jConfigLocation</param-name>           <param-value>WE

log4j中Logger.getLogger与LogFactory.getLog的区别

Logger来自log4j自己的包.如果用Logger.getLogger,需要一个log4j的jar包,用此方式你只能依靠log4j; LogFactory来自common-logging包.如果用LogFactory.getLog,你可以用任何实现了通用日志接口的日志记录器替换log4j,而程序不受影响. apache的common-logging包是通用日志接口,通过这个中间层,你可以随便指定到底用哪个日志系统.增加系统的灵活性.若log4j它不存在, commons-logging 会另

JMX学习以及在log4j中的应用

前言 JMX即Java Managemen Extensions,是一个为应用程序植入管理功能的框架.一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理. 常常在编程的过程中有一些配置信息需要动态的进行改变,我以往会有如下几种做法: 写死在Java code中,环境发生变化的时候修改Java code 写在名为*.properties的配置文件里,使用Java读取配置文件 然而今天我们将引入一种高级的方式来进行配置信息的管理,那便是JMX的引入. 如何使用J

如何关闭log4j中配置的spring或者hibernate的日志信息

通常在建立一个web项目的时候,我们通常需要为其配置日志,以便了解启动过程中发生了什么,如果启动过程中发生了错误,则可以很方便的查看错误的信息,但是在项目部署到服务器上时,打印日志信息,需要耗费大量的时间,启动速度会很慢, 那么如何关闭这些日志信息呢 只需要的lo4j.properties文件中配置如下两句话即可 log4j.logger.org.springframework=OFF log4j.logger.org.hibernate=OFF

解决在web项目使用log4j中无法将log信息写入文件

这是log4j.properties中关于的配置 log4j.appender.appender2.File=F:/myeclipseworkspace2/SecondBook2/log/secondbook.log 在这里需要注意两个问题: 1. 必须写绝对路径,如果不写绝对路径,log信息只能输入到console.具体是为什么我也不知道. 2. 路径分隔符为 / .