log4j中MDC和NDC作用以及用途

Posted JAVA后端技术之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j中MDC和NDC作用以及用途相关的知识,希望对你有一定的参考价值。


NDC和MDC是log4j用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。

在log的时候将信息输出。在相应的PatternLayout中使用”%x”来输出存储的上下文信息

例如:String remoteAddr = request.getRemoteAddr();

NDC.push(remoteAddr);

在log4j.properties文件中作如下的配置即可

log4j.appender.console.layout.ConversionPattern=%-d{yyyy/MM/dd HH:mm:ss,SSS} [%X] -[%c]-[%p] %m%n

 

MDC内部使用了类似map的机制来存储信息,相对应的方法,MDC.put(key, value);在配置PatternLayout的时候使用:%x{key}来输出对应的value

例如:String remoteAddr = request.getRemoteAddr();

MDC.put("ip", remoteAddr); 

 

在log4j.properties文件中作如下的配置即可

log4j.appender.console.layout.ConversionPattern=%-d{yyyy/MM/dd HH:mm:ss,SSS} [%X{ip}] -[%c]-[%p] %m%n

如果在项目中有过滤器,你可以把获取ip 的方法直接定义在过滤器中,然后在配置文件中配置获取ip的显示就可以了

=====================================================================

下面附上MDC应用代码:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
String user = request.getSession().getAttribute(Constants.SESN_USR_NAME)+"";
MDC.put("user", StringUtils.isBlank(user)?"":user );
if (LOG.isDebugEnabled()){
long beginTime = System.currentTimeMillis();//1、开始时间
       startTimeThreadLocal.set(beginTime); //线程绑定变量(该数据只有当前请求的线程可见)
       LOG.debug("开始计时: {}  URI: {}", new SimpleDateFormat("hh:mm:ss.SSS").format(beginTime), request.getRequestURI());
}
return true;

}

log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss,SSS} -[%p] %X{user} method:[%l (%rms)] - %m%n


用法还是很简单的。

这样在程序里可以不用在打印日志的时候加上用户了。同样存在一些IP等的需求也可以这样做。

能够减少不少工作量,也能避免大家忘记打印用户name。


以上是关于log4j中MDC和NDC作用以及用途的主要内容,如果未能解决你的问题,请参考以下文章

log4j MDC NDC详解

通过slf4j/log4j的MDC/NDC 实现日志追踪

Log4j2之ThreadContext

LOG4J2-MDC-全链路跟踪等功能研究

LOG4J2-MDC-全链路跟踪等功能研究

log4j MDC用户操作日志追踪配置