天天看點

spring aop 方法增加日志記錄

使用場景:

  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