PRELOADER

当前文章 : 《springBoot使用AOP处理MDC追踪日志》

12/28/2019 —— 

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>
        <!--[%15.15t]-->
    </layout>
</appender>

使用完后MDC.clear(); 来清除本次请求。