ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 网络编程 >> 其他编程教程 >> slf4j中的MDC

slf4j中的MDC(1/2)

来源:网络整理     时间:2018-09-27     关键词:

本篇文章主要介绍了" slf4j中的MDC",主要涉及到方面的内容,对于其他编程教程感兴趣的同学可以参考一下: 一.slf4j中MDC是什么  slf4j除了trace、debug、info、warn、error这几个日志接口外,还可以配合MDC将数据写入日志。换句话说M...

一.slf4j中MDC是什么

  slf4j除了trace、debug、info、warn、error这几个日志接口外,还可以配合MDC将数据写入日志。换句话说MDC也是用来记录日志的,但它的使用方式与使用日志接口不同。

  在使用日志接口时我们一般这么做

Logger LOG = LoggerFactory.getLogger("LOGNAME_OR_CLASS");
if(LOG.isDebugEnabled()) {
  LOG.debug("log debug");
}

  MDC从使用方式上有些不同,我对它的理解是MDC可以将一个处理线程中你想体现在日志文件中的数据统一管理起来,根据你的日志文件配置决定是否输出。

  比如以下但不限于以下场景可以考虑使用MDC来达到目的

  1.我们想在日志中体现请求用户IP地址

  2.用户使用http客户端的user-agent

  3.记录一次处理线程的日志跟踪编号(这个编号目的是为了查询日志方便,结合grep命令能根据跟踪编号将本次的处理日志全部输出)

二.MDC的使用

  org.slf4j.MDC我个人会用AOP或Filter或Interceptor这类工具配合使用,获得你希望输出到日志的变量并调用MDC.put(String key, String val),比如下面代码片段第5行:

@Around(value = "execution(* com.xx.xx.facade.impl.*.*(..))", argNames="pjp")
public Object validator(ProceedingJoinPoint pjp) throws Throwable {
  try {
	  String traceId = TraceUtils.begin();
	  MDC.put("mdc_trace_id", traceId);
	  Object obj = pjp.proceed(args);
	  return obj;
  } catch(Throwable e) {
	  //TODO 处理错误
  } finally {
	  TraceUtils.endTrace();
  }
}

  代码通过AOP记录了每次请求的traceId并使用变量"mdc_trace_id"记录,在日志配置文件里需要设置变量才能将"mdc_trace_id"输出到日志文件中。我以logback配置文件为例,看日志第10行%X{mdc_trace_id}:

<appender name="ALL">
  <file>${CATALINA_BASE}/logs/all.log</file>
  <rollingPolicy>
	  <!-- daily rollover -->
	  <fileNamePattern>${CATALINA_BASE}/logs/all.%d{yyyy-MM-dd}.log</fileNamePattern>
	  <!-- keep 30 days' worth of history -->
	  <maxHistory>30</maxHistory>
  </rollingPolicy>
  <encoder charset="UTF-8">
	  <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - traceId:[%X{mdc_trace_id}] - %msg%n</pattern>
  </encoder>
</appender>

三.MDC带来的好处

  1.如果你的系统已经上线,突然有一天老板说我们增加一些用户数据到日志里分析一下。如果没有MDC我猜此时此刻你应该处于雪崩状态。MDC恰到好处的让你能够实现在日志上突如其来的一些需求

相关图片

相关文章