spring aop 方法增加日志记录

Posted 花开浪漫拾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于spring aop 方法增加日志记录的主要内容,如果未能解决你的问题,请参考以下文章

从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志

Spring AOP 实现日志记录功能

从头认识Spring-3.5 简单的AOP日志实现(注解版)-某方法之前的前后记录日志

从头认识Spring-3.1 简单的AOP日志实现-某方法之前的前后记录日志

spring aop的xml设置

spring ioc的详解?