加入收藏 | 设为首页 | 会员中心 | 我要投稿 甘南站长网 (https://www.0941zz.com/)- 科技、行业物联网、开发、云计算、云管理!
当前位置: 首页 > 编程开发 > Java > 正文

Slf4j MDC机制

发布时间:2023-02-16 13:50:47 所属栏目:Java 来源:互联网
导读:MDC 简介 MDC ( Mapped Diagnostic Contexts ),它是一个线程安全的存放诊断日志的容器。 Logback设计的一个目标之一是对分布式应用系统的审计和调试。在现在的分布式系统中,需要同时处理很多的请求。如何来很好的区分日志到底是那个请求输出的呢?我们可以

          // 输出发布日志请求的java源码的文件名
          defaultConverterMap.put("F",FileOfCallerConverter.class.getName());
          defaultConverterMap.put("file",FileOfCallerConverter.class.getName());
          // 输出和发布日志事件关联的线程的MDC
          defaultConverterMap.put("X",MDCConverter.class.getName());
          defaultConverterMap.put("mdc",MDCConverter.class.getName());
          // 输出和日志事件关联的异常的堆栈信息
          defaultConverterMap.put("ex",ThrowableProxyConverter.class.getName());
          defaultConverterMap.put("exception",ThrowableProxyConverter.class
                  .getName());
          defaultConverterMap.put("rEx",RootCauseFirstThrowableProxyConverter.class.getName());
          defaultConverterMap.put("rootException",RootCauseFirstThrowableProxyConverter.class
                  .getName());
          defaultConverterMap.put("throwable",ThrowableProxyConverter.class
                  .getName());
          // 和上面一样,此外增加类的包信息
          defaultConverterMap.put("xEx",ExtendedThrowableProxyConverter.class.getName());
          defaultConverterMap.put("xException",ExtendedThrowableProxyConverter.class
                  .getName());
          defaultConverterMap.put("xThrowable",ExtendedThrowableProxyConverter.class
                  .getName());
          // 当我们想不输出异常信息时,使用这个。其假装处理异常,其实无任何输出
          defaultConverterMap.put("nopex",nopThrowableinformationConverter.class
                  .getName());
          defaultConverterMap.put("nopexception",nopThrowableinformationConverter.class.getName());
          // 输出在类附加到日志上的上下文名字.
          defaultConverterMap.put("cn",ContextNameConverter.class.getName());
          defaultConverterMap.put("contextName",ContextNameConverter.class.getName());
          // 输出产生日志事件的调用者的位置信息
          defaultConverterMap.put("caller",CallerDataConverter.class.getName());
          // 输出和日志请求关联的marker
          defaultConverterMap.put("marker",MarkerConverter.class.getName());
          // 输出属性对应的值,一般为System.properties中的属性
          defaultConverterMap.put("property",PropertyConverter.class.getName());
          // 输出依赖系统的行分隔符
          defaultConverterMap.put("n",LineseparatorConverter.class.getName());
          // 相关的颜色格式设置
          defaultConverterMap.put("black",BlackCompositeConverter.class.getName());
          defaultConverterMap.put("red",RedCompositeConverter.class.getName());
          defaultConverterMap.put("green",GreenCompositeConverter.class.getName());
          defaultConverterMap.put("yellow",YellowCompositeConverter.class.getName());
          defaultConverterMap.put("blue",BlueCompositeConverter.class.getName());
          defaultConverterMap.put("magenta",magentaCompositeConverter.class.getName());
          defaultConverterMap.put("cyan",CyanCompositeConverter.class.getName());
          defaultConverterMap.put("white",WhiteCompositeConverter.class.getName());
          defaultConverterMap.put("gray",GrayCompositeConverter.class.getName());
          defaultConverterMap.put("boldRed",BoldRedCompositeConverter.class.getName());
          defaultConverterMap.put("boldGreen",BoldGreenCompositeConverter.class.getName());
          defaultConverterMap.put("boldYellow",BoldYellowCompositeConverter.class.getName());
          defaultConverterMap.put("boldBlue",BoldBlueCompositeConverter.class.getName());
          defaultConverterMap.put("boldmagenta",BoldmagentaCompositeConverter.class.getName());
          defaultConverterMap.put("boldCyan",BoldCyanCompositeConverter.class.getName());
          defaultConverterMap.put("boldWhite",BoldWhiteCompositeConverter.class.getName());
          defaultConverterMap.put("highlight",HighlightingCompositeConverter.class.getName());
      }
  }
  Notes:日志模板配置,使用 %为前缀让解析器识别特殊输出模式,然后以{}后缀结尾,内部指定相应的参数设置。
 
  使用切面
  在处理请求前将请求的唯一标示放到MDC容器中如sessionId,这个唯一标示会随着日志一起输出,以此来区分该条日志是属于那个请求的。这个我们可以使用Advanced来实现,可以使用filter,interceptor等。
 
  Interceptor
  可以参考篇文章Logback 快速定位用户在一次请求中的所有日志。
 
  MDCInsertingServletFilter
  这是Logback提供的一个filter,他会将一些请求信息放到MDC容器中,这个filter最好放到配置编码的filter之后。以下是详细的key:
 
  MDC key MDC value
  req.remoteHost as returned by the getRemoteHost() method
  req.xForwardedFor value of the "X-Forwarded-For" header
  req.method as returned by getMethod() method
  req.requestURI as returned by getRequestURI() method
  req.requestURL as returned by getRequestURL() method
  req.queryString as returned by getQueryString() method
  req.userAgent value of the "User-Agent" header
  使用配置:需要保证filter在需要使用的到该MDC的其他filter之前。
 
  
 
  <filter>
   <filter-name>MDCInsertingServletFilter</filter-name>

(编辑:甘南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读