使用場景:
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