注解+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 省时省力的管理好接口日志的主要内容,如果未能解决你的问题,请参考以下文章

java使用注解加ASPECT实现拦截方法打印方法日志

java使用注解加ASPECT实现拦截方法打印方法日志

Spring AOP中@Aspect拦截介绍(二)

SpringBoot和@Aspect实现自建Log日志功能

SpringBoot和@Aspect实现自建Log日志功能

Spring Boot @Aspect 切面编程实现访问请求日志记录