1 import org.aspectj.lang.JoinPoint;
2 import org.aspectj.lang.Signature;
3 import org.aspectj.lang.annotation.AfterReturning;
4 import org.aspectj.lang.annotation.Aspect;
5 import org.aspectj.lang.annotation.Before;
6 import org.aspectj.lang.annotation.Pointcut;
7 import org.aspectj.lang.reflect.MethodSignature;
8 import org.slf4j.Logger;
9 import org.slf4j.LoggerFactory;
10 import org.springframework.core.annotation.Order;
11 import org.springframework.stereotype.Component;
12 import org.springframework.web.context.request.RequestContextHolder;
13 import org.springframework.web.context.request.ServletRequestAttributes;
14
15 import javax.servlet.http.HttpServletRequest;
16 import java.io.UnsupportedEncodingException;
17 import java.net.URLDecoder;
18
19 /**
20 * 实现Web层的日志切面
21 * @author lpf
22 */
23 @Component
24 @Aspect
25 @Order(1)
26 public class WebLogAspect {
27 private Logger log = LoggerFactory.getLogger(getClass());
28 private ThreadLocal<Long> startTime = new ThreadLocal<>();
29
30 /**
31 * 定义一个切入点.
32 * 解释下:
33 * <p>
34 * ~ 第一个 * 代表任意修饰符及任意返回值.
35 * ~ 第二个 * 任意包名
36 * ~ 第三个 * 定义在web包或者子包
37 * ~ 第四个 * 任意方法
38 * ~ .. 匹配任意数量的参数.
39 */
40 // @Pointcut("execution(public * com.kfit.*.web..*.*(..))")
41 // use
42 // @Pointcut("execution(public * org.zhilan..*Controller.*(..))")
43
44 // @Pointcut("(execution(public * org.zhilan.timer.*Service.*(..)))")
45 @Pointcut("(execution(public * com.haoyun..*Controller.*(..))) "
46 // + "|| execution(public * com.haoyun.timer.*Service.*(..)) "
47 + "&& !execution(* com.haoyun.login.LoginController.getSystemState())"
48 )
49 public void webLog() {
50 }
51
52 @Before("webLog()")
53 public void doBefore(JoinPoint joinPoint) throws UnsupportedEncodingException {
54 startTime.set(System.currentTimeMillis());
55
56 // 接收到请求,记录请求内容
57 log.info("========================= before start =========================");
58 Signature signature = joinPoint.getSignature();
59 MethodSignature methodSignature = (MethodSignature) signature;
60
61 log.info("CLASS_METHOD : " + methodSignature.getDeclaringTypeName() + "." + methodSignature.getName());
62
63 // 记录下请求内容
64 ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
65 if(attributes != null){
66 HttpServletRequest request = attributes.getRequest();
67 log.info("IP : " + request.getRemoteAddr());
68 }
69
70 log.info("请求参数: 名称 值");
71 String[] argsNameArray = methodSignature.getParameterNames();
72 Object[] argsValueArray = joinPoint.getArgs();
73 for (int i = 0; i < argsNameArray.length; i++) {
74 log.info("args_name: " + argsNameArray[i]);
75
76 String argValue = argsValueArray[i] != null ? argsValueArray[i].toString() : "";
77 if (argsNameArray[i].contains("encode")) {
78 String str = URLDecoder.decode(argValue, "utf-8");
79 log.info("args_value: " + (str.length() > 200 ? str.substring(0, 200) + "..." : str));
80 } else {
81 log.info("args_value: " + (argValue.length() > 200 ? argValue.substring(0, 200) + "..." : argValue));
82 }
83 }
84
85 log.info("========================= before end =========================");
86 }
87
88 @AfterReturning(returning="rvt", pointcut="webLog()")
89 public void doAfterReturning(JoinPoint joinPoint, Object rvt) {
90 // 处理完请求, 返回内容
91 log.info("========================= after returning start =========================");
92 Signature signature = joinPoint.getSignature();
93 log.info("CLASS_METHOD : " + signature.getDeclaringTypeName() + "." + signature.getName());
94
95 if(rvt != null){
96 String str = rvt.toString();
97 if (str.length() > 200) {
98 str = str.substring(0, 200) + "...";
99 }
100
101 log.info("return 返回值:");
102 log.info(str);
103 }
104
105 log.info("耗时(毫秒) : " + (System.currentTimeMillis() - startTime.get()));
106
107 log.info("========================= after returning end =========================");
108 }
109 }