当前位置: 首页 > 科技观察

从头搭建开发脚手架,使用MDC实现日志链接追踪

时间:2023-03-12 20:39:18 科技观察

转载本文请联系Java大厂面试官公众号。PrefacePrinciple实现filterlogback.xml返回body效果日志Preface在微服务环境下,我们经常使用Skywalking、CAT等来跟踪整体请求链路,但整体运维成本高,架构复杂。让我们使用MDC通过Log来实现一个轻量级的会话事务跟踪功能。原理MDCorg.sl4j.MDC里面其实就是ThreadLocal。MDC提供了put/get/clear等几个核心接口,用于操作ThreadLocal中的数据;ThreadLocal中的K-V可以在logback.xml中声明,最终会打印在日志中。//java代码MDC.put("userId","laker");//logback.xml%X{userId}例如:整体流程如下:当用户登录系统时,我们在日志。当用户发起一个请求时,实际上一个请求中可能会产生多个http请求。这里,前端可以在返回体中生成一个requestId,返回requestId。研发运维人员可以根据userId和requestId从日志中获取请求链接。过滤器@Order(value=Ordered.HIGHEST_PRECEDENCE+100)@Component@WebFilter(filterName="MDCFilter",urlPatterns="/*")publicclassMDCFilterextendsOncePerRequestFilter{@OverrideprotectedvoiddoFilterInternal(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,FilterChainfilterChain)throwsServletException,IOException{try{MDC.put("userId","laker");MDC.put("requestId",IdUtil.fastUUID());}catch(Exceptione){//}try{filterChain.doFilter(httpServletRequest,httpServletResponse);}最后{MDC.clear();}}}logback.xml${LOG_HOME}/test.logtruefalse%d{yyyy-MM-ddHH:mm:ss.SSS}[%t]%-5level%logger{50}%line-%m%n${LOG_HOME}/test.log.%d{yyyy-MM-dd}15${log.pattern}%d{yyyy-MM-ddHH:mm:ss.SSS}[%t]%-5level%logger{50}%line-%m%nreturnbodypublicclassResponse{@ApiModelProperty(notes="响应码,不为200则异常",example="200")privatefinalintcode;@ApiModelProperty(notes="响应消息",example="提交成功")privatefinalStringmsg;@ApiModelProperty(notes="responsedata")privatefinalTdata;@ApiModelProperty(notes="requestid")privatefinalStringrequestId;publicResponse(intcode,Stringmsg,Tdata){this.code=code;this.msg=msg;this.data=data;this.requestId=MDC.get("requestId");}有效日志响应{code:200,msg:"",requestId:"74a269a8-3cb4-417e-853c-b968b77cce23"}日志18:37:15.997[http-nio-8080-exec-1]信息[湖人|90717490-5ef4-4e46-bc2c-605952fc3803]c.l.m.c.InfoController-[v2Map,17]-null18:380:38.9[http-nio-8080-exec-2]INFO[laker|82bde351-f86e-466f-97a0-c857a0c4c1c9]c.l.m.c.InfoController-[v2Map,17]-null18:37:39.992[http-nio-8080-exec-3]信息[湖人|74a269a8-3cb4-417e-853c-b968b77cce23]c.l.m.c.InfoController-[v2Map,17]-null