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> (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |