一、MDC介绍
MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程序采用多线程的方式来处理多个用户的请求。在一个用户的使用过程中,可能有多个不同的线程来进行处理。典型的例子是 Web 应用服务器。当用户访问某个页面时,应用服务器可能会创建一个新的线程来处理该请求,也可能从线程池中复用已有的线程。在一个用户的会话存续期间,可能有多个线程处理过该用户的请求。这使得比较难以区分不同用户所对应的日志。当需要追踪某个用户在系统中的相关日志记录时,就会变得很麻烦。
一种解决的办法是采用自定义的日志格式,把用户的信息采用某种方式编码在日志记录中。这种方式的问题在于要求在每个使用日志记录器的类中,都可以访问到用户相关的信息。这样才可能在记录日志时使用。这样的条件通常是比较难以满足的。MDC 的作用是解决这个问题。
MDC 可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC 中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线程中的 MDC 的内容。当需要记录日志时,只需要从 MDC 中获取所需的信息即可。MDC 的内容则由程序在适当的时候保存进去。对于一个 Web 应用来说,通常是在请求被处理的最开始保存这些数据。
二、MDC使用案例
相对比较大的项目来说,一般会有多个开发人员,如果每个开发人员凭自己的理解打印日志,那么当用户反馈问题时,很难通过日志去快速的定位到出错原因,也会消耗更多的时间。所以针对这种问题,一般会定义好整个项目的日志格式,如果是需要追踪的日志,开发人员调用统一的打印方法,在日志配置文件里面定义好相应的字段,通过MDC功能就能很好的解决问题。
比如我们可以事先把用户的sessionId,登录用户的用户名,访问的城市id,当前访问商户id等信息定义成字段,线程开始时把值放入MDC里面,后续在其他地方就能直接使用,无需再去设置了。
使用MDC来记录日志,一来可以规范多开发下日志格式的一致性,二来可以为后续使用ELK对日志进行分析。
<dependency>
<groupId>log4j</groupId>
一、MDC介绍 MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。某些应用程序采用多线程的方式来处理多个用户的请求。在一个用户的使用过程中,可能有多个不同的线程来进行处理。典型的例子是 Web 应用服务器。当用户访问某个页面时,应用服务器可能会创建一个新的线程来处理该请求,也...
IDEA 导入 logs-examples
1. log4j 的XML配置使用
2. log4j2 的配置详解,JDBC 配置,CloseableThreadContext 的使用(自定义输出日志文件 例如 logback MDC)
3.logback 的XML配置与使用,MDC的使用,SiftingAppender,DBAppender(c3p0,druid)
详细查看代码:README.md 文件 和 注释说明
开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用ELK来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿行其中导致很难筛选出指定请求的全部相关日志,以及下游线程/服务对应的日志。
二、解决思路
每个请求都使用一个唯一标识来追踪全部的链路显示在日志中,并且不修改原有的打印方式(代码无入侵)
使用Logback的MDC机制日志模板中加入traceId标识,取值方式为%X{traceId}
MDC(Mapped Diagnos
一、 首先简单介绍log4j的使用步骤
整体上分为如下几个步骤:1、引入log4j-*.*jar,的Jar包;2、添加配置文件(log4j.xml或log4j.properties);3、包装log工具类在业务中使用。此为传统的使用步骤,不过我们可以直接用lombok包装好的log工具类,具体步骤:
1.1 引入jar包
org.project
1.首先实现一个interceptor,在请求开始的时候MDC put一个Session标志,interceptor结束的时候remove掉
public class SessionInterceptor implements HandlerInterceptor {
* 会话ID
private final static Strin...
要想实现获取IP并显示在log中必须先了解log4j自带的两个类MDC和NDC
NDC和MDC是log4j用于存储应用程序的上下文信息(context infomation),从而便于在log中使用这些上下文信息。
NDC采用了一个类似栈的机制来push存储上下文信息,每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC,储存...
物料准备:1.自定义1个线程
MDC打点工具类2.
配置logback打印
MDC打点的traceId3.
配置webMVC使用
MDC打点4.
配置ThreadPoolTaskExecutor使用
MDC打点5.
配置HttpClient使用
MDC打点6.测试
MDC日志打点效果
配置logback 输出的
日志格式,要输出
mdc里定义的traceId
配置webMVC使用
MDC打点
定义MvcTraceInterceptor,来拦截http请求进行
mdc打点
使用自定义的MvcTraceInterceptor
log4j-2-弹性
我创建了这个项目,以共享和增强附加程序,该附加程序将消息直接记录到集群中。 在某些特定情况下,这种将日志聚合到Elasticsearch中的方法可以很好地替代Elastic Beats。
该产品包括一些标准和某些特定功能:
利用具有批量存储请求的Log4j2异步日志记录。 批处理模式会自动识别。 可以配置基于超时的缓冲区刷新。
将@Logged带注释的日志消息参数对象作为嵌入式JSON字段存储到Elasticsearch中存储的日志文档中。
映射诊断上下文(MDC)支持。
连接到多个群集节点。
基本身份验证。
Log4j的“ ignoreExceptions”选项支持。
Log4j的“ includeLocation”选项支持。
Log4j布局和过滤器支持。
如果要创建自己的本地开发环境,则只需在首选的IDE中将此代码作为标准Maven项
LOG4J2的MDC应用
MDC的概念:Manufacturing Data Collection 生产数据实时采集和分析。
有时实际开发过程没有发现的BUG在生产环境才出现,需要到生产环境去分析实时日志来进行BUG跟踪;
LOG4J2提供了MDC功能可以将特定用户的日志单独处理输出到特定的文件中。
配置关键字ThreadContext ,DynamicThresholdFilter ,ThreadContextMapFilter
1.DynamicThresholdFilter 从整体上控制日志默认输出级别,对于特定的值可以调整日志级别
<!--ThreadContext.put("loginId", "User1"); 除了User1之外其他的日志都默认是ERROR级别,USER1相关的日志是DEBUG级别 -->
<DynamicThresholdFilter key="loginI