aop+MDC 给每次请求追加流水号,并在业务代码中追踪

今天项目经理跑来跟我说,想要在给每次请求配置一个流水号,使之可以在请求中的业务代码之间追踪。

我查了下Logback的资料,发现有一个功能MDC(mapped diagnostic context)可以实现,通过把上下文信息放入MDC中,来标记每个请求。

https://logback.qos.ch/manual/mdc.html

 

根据官方实例,有了基本思路:

通过AOP,给每个web接口进来的请求配置eventID

package cn.pelerin.writereport.configure;



import lombok.extern.slf4j.Slf4j;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.annotation.After;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.slf4j.MDC;

import org.springframework.core.annotation.Order;

import org.springframework.stereotype.Component;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;



import javax.servlet.http.HttpServletRequest;

import java.util.Arrays;




@Aspect

@Component

@Slf4j

@Order(4)

public class WebAspect {

//获取线程副本

ThreadLocal startTime=new ThreadLocal<>();



@Pointcut("execution(public * cn.pelerin.writereport.web.*.*(..))")

public void weblog(){}



@Before("weblog()")

public void doBefore(JoinPoint joinPoint){

//获取请求报文头部元数据

ServletRequestAttributes requestAttributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

//获取请求对象

HttpServletRequest request=requestAttributes.getRequest();

Long millis = System.currentTimeMillis();

//NDC.push(millis.toString());

MDC.put("eventId",String.valueOf(millis));

//记录控制器执行前的时间毫秒数

startTime.set(millis);

log.info("前置通知执行:");

log.info("url:"+request.getRequestURL());

log.info("method:"+request.getMethod());

log.info("ip:"+request.getRemoteAddr());

log.info("class_method:"+joinPoint.getSignature().getDeclaringTypeName()+

"."+joinPoint.getSignature().getName());

log.info("args:"+ Arrays.toString(joinPoint.getArgs()));

log.info("流水号:"+millis);

}



@After("weblog()")

public void doFinaly(){

log.info("流水号:"+MDC.get("eventId") + "执行完毕");

MDC.remove("eventId");

}



}

 

然后在log appender中输出









%date{yyyy-MM-dd HH:mm:ss.SSS} |-[%thread] %X{eventId} %-5level [%file:%line] - %msg%n









 

%X的作用就是用于获取MDC上下文的信息,后面不带参为输出所有,带参为输出key为参数的value。

 

 

最后的效果如下

 

 

 

 

 

你可能感兴趣的:(aop+MDC 给每次请求追加流水号,并在业务代码中追踪)