使用场景:
1:调用外部接口时需要记录出参和入参。
2:分布式系统之间,调用各个系统之间需要记录日志,一旦出现了问题也可以找得到元数据
一言不合,上代码:
# 枚举类
1 package xxxxxxxxxx;
2
3 import java.lang.annotation.ElementType;
4 import java.lang.annotation.Retention;
5 import java.lang.annotation.RetentionPolicy;
6 import java.lang.annotation.Target;
7
8 /**
9 * @desc 记录提交参数和返回值
10 */
11 @Target({ ElementType.METHOD })
12
13 @Retention(RetentionPolicy.RUNTIME)
14 public @interface MethodLog {
15
16 /**
17 *
18 * @desc 描述; 如:短息接口
19 */
20 String value() default "";
21 }
View Code
# aop类
1 package xxxxxxx;
2
3 import org.apache.logging.log4j.Logger;
4 import org.aspectj.lang.ProceedingJoinPoint;
5 import org.aspectj.lang.annotation.Around;
6 import org.aspectj.lang.annotation.Aspect;
7 import org.aspectj.lang.annotation.Pointcut;
8 import org.aspectj.lang.reflect.MethodSignature;
9 import org.springframework.context.annotation.Configuration;
10
11 import com.yunyihenkey.common.annotation.MethodLog;
12 import com.yunyihenkey.common.utils.JacksonUtils;
13 import com.yunyihenkey.common.utils.LogUtils;
14
15 /**
16 *
17 * @desc 拦截方法的入参信息和返回信息
18 */
19 @Aspect
20 @Configuration
21 public class MethodLogAop {
22 public static final String NULL_STR = "无";
23
24 @Pointcut(value = "@annotation(com.yunyihenkey.common.annotation.MethodLog)")
25 public void pointcut() {
26
27 }
28
29 @Around(value = "pointcut()")
30 public Object service(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
31
32 // 获取拦截的方法名
33 MethodSignature msig = (MethodSignature) proceedingJoinPoint.getSignature();
34 // 获取到注解
35 MethodLog auth = msig.getMethod().getAnnotation(MethodLog.class);
36 // 获取方法参数
37 Object[] objectsArray = proceedingJoinPoint.getArgs();
38
39 // 纳秒时间戳
40 long nanoTime = System.nanoTime();
41
42 StringBuilder sb = new StringBuilder().append(nanoTime).append(":::调用").append(auth.value()).append(":::")
43 .append(msig.getDeclaringType().getSimpleName()).append(".").append(msig.getName());
44 int end = sb.length();
45
46 Logger logger = LogUtils.getLogger();
47
48 sb.append(":::传入参数:::");
49 if (objectsArray == null || objectsArray.length == 0) {
50 logger.info(sb.append(NULL_STR).toString());
51 } else {
52 for (int i = 0, z = objectsArray.length; i < z; i++) {
53 Object obj = objectsArray[i];
54 sb.append(",参数").append(i).append("=").append(
55 obj instanceof CharSequence ? (CharSequence) obj : JacksonUtils.writeValueAsString(obj));
56 }
57 logger.info(sb.toString());
58 }
59
60 // 执行方法
61 Object resultObj = proceedingJoinPoint.proceed();
62 if (resultObj == null) {
63 resultObj = NULL_STR;
64 }
65
66 // 删除上一次节点的文字
67 sb.delete(end, sb.length());
68 logger.info(sb.append(":::返回参数:::")
69 .append(resultObj instanceof CharSequence ? (CharSequence) resultObj
70 : JacksonUtils.writeValueAsString(resultObj))
71 .append(" !!!!!!耗时(ms):").append((System.nanoTime() - nanoTime) / 1000000));
72
73 return resultObj;
74 }
75
76 }
View Code
使用方式:
在需要的方法加上@MethodLog("阿里发送短信接口")注解,注解内的字符串是描述内容。
日志效果:
2018-06-08 19:08:37.824 [INFO] [main] com.common.utils.springmanage.MethodLogAop.service(57) -
35950692002844:::调用阿里发送短信接口:::TestAaaInterfaceWrapper.testHtml:::传入参数:::,参数0={"x":"","y":""}
2018-06-08 19:08:38.013 [INFO] [main] com.common.utils.springmanage.MethodLogAop.service(68) -
35950692002844:::调用阿里发送短信接口:::TestAaaInterfaceWrapper.testHtml:::返回参数:::{"errno":1,"data":[]} !!!!!!耗时(ms):261
转载于:https://www.cnblogs.com/wulm/p/9157241.html