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 }
# 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 }
使用方式:
在需要的方法加上@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-3.5 简单的AOP日志实现(注解版)-某方法之前的前后记录日志