注解+Aspect 省时省力的管理好接口日志
Posted 光光-Leo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解+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 省时省力的管理好接口日志的主要内容,如果未能解决你的问题,请参考以下文章