本文主要是介绍注解+Aspect 省时省力的管理好接口日志,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
背景
无论是对外提供的RPC接口,还是项目内的普通方法,我们都会有需要打印方法入参、出参的需求,方便在遇到问题时通过查看日志快速定位,我们也会需要对方法的执行时间进行打印 方便分析和调优。
比较笨的做法就是在每个需要打印日志的地方使用log.info对参数进行打印,在每个方法内部方法体前后获取系统时间 在最后打印时间差
但这种对方法自身业务逻辑没有什么意义的的代码 侵入性太强 编写时也浪费时间 所以我们可以通过注解+AOP的方法 对这些操作进行封装 基于注解的控制又方便随时随地的使用
怎么做
定义注解
package com.common.interceptor.annotation;import java.lang.annotation.*;/*** 方法执行的入参 出参 及 执行时间*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RunTimeAnnotation {
}
Aspect
我们使用Aspect进行切面开发
首先引用对应的pom依赖
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.7.3</version></dependency>
定义切面类:
这里使用@Around定义环绕通知
package com.common.interceptor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Aspect
@Component
public class RunTimeAspect {private static final Logger logger = LoggerFactory.getLogger(RunTimeAspect.class);@Around("@annotation(com.common.interceptor.annotation.RunTimeAnnotation)")public Object around(ProceedingJoinPoint joinPoint) throws Throwable{long startTime = System.currentTimeMillis();//接收到请求,记录请求内容MethodSignature signature = (MethodSignature) joinPoint.getSignature();//获取参数Object[] args = joinPoint.getArgs();//获取方法String methodName = signature.getDeclaringTypeName() + "." + signature.getName();Object obj = null;try {logger.info("{}方法执开始执行,入参{}",methodName,args);obj = joinPoint.proceed();long excuteTime = System.currentTimeMillis() - startTime;logger.info("{}方法执结束执行,耗时{}ms,入参{},返回值{}",methodName,excuteTime,args,obj);} catch (Exception throwable) {logger.error("{}方法执行异常{}",methodName,throwable);//异常要抛出去 否则会影响外部方法事务回滚throw throwable;}return obj;}
}
写好后,我们只需要在需要的地方加上@RunTimeAnnotation 注解就可以了
@RunTimeAnnotation
public void consumer(String message){//...
}
这篇关于注解+Aspect 省时省力的管理好接口日志的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!