MDC是线程级别的
首先引入jar 包,pom依赖。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.3</version> </dependency> ```
将用户id设置为追踪对象MDC.put("requestId",userId),在解决某一用户的问题时可以很好的定位。
``` @Configuration @Aspect public class SpringAOP {
private static final Logger logger = LoggerFactory.getLogger(SpringAOP.class);
/** * 定义切点Pointcut * 第一个*号:表示返回类型, *号表示所有的类型 * 第二个*号:表示类名,*号表示所有的类 * 第三个*号:表示方法名,*号表示所有的方法 * 后面括弧里面表示方法的参数,两个句点表示任何参数 */ @Pointcut("execution(* com.zkld.xtgx.api..*.*(..))") public void executionService() {
}
/** * 方法调用之前调用 * @param joinPoint */ @Before(value = "executionService()") public void doBefore(JoinPoint joinPoint){
CBPUserVo cbpUserVo = (CBPUserVo) SecurityContextHolder.getContext().getAuthentication().getCredentials(); Long accountId = cbpUserVo.getRealCbpId(); //添加日志打印
MDC.put("requestId",String.valueOf(accountId)); logger.info("=====>@Before:请求参数为:{}", Arrays.toString(joinPoint.getArgs()));
}
/** * 方法之后调用 * @param joinPoint * @param returnValue 方法返回值 */ @AfterReturning(pointcut = "executionService()",returning="returnValue") public void doAfterReturning(JoinPoint joinPoint, Object returnValue){
logger.info("=====>@AfterReturning:响应参数为:{}",returnValue); // 处理完请求,返回内容 MDC.clear(); }
/** * 统计方法执行耗时Around环绕通知 * @param joinPoint * @return */ @Around("executionService()") public Object timeAround(ProceedingJoinPoint joinPoint) {
//获取开始执行的时间 long startTime = System.currentTimeMillis();
// 定义返回对象、得到方法需要的参数 Object obj = null; //Object[] args = joinPoint.getArgs();
try { obj = joinPoint.proceed(); } catch (Throwable e) { logger.error("=====>统计某方法执行耗时环绕通知出错", e); }
// 获取执行结束的时间 long endTime = System.currentTimeMillis(); //MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //String methodName = signature.getDeclaringTypeName() + "." + signature.getName(); // 打印耗时的信息 logger.info("=====>处理本次请求共耗时:{} ms",endTime-startTime); return obj; }
}
|
在日志中打印需要修改log配置如下:
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID:-} [%X{requestId}] %-40.40logger{39} : %m%n</pattern>
</layout>
</appender>
使用完后MDC.clear(); 来清除本次请求。