通过自定义注解和AOP实现拦截接口调用记录日志

通过自定义注解和AOP实现拦截接口调用记并录日志


前言

实现其实很简单,分为三步,首先自定义一个注解,然后写一个拦截器类,再在想要拦截的接口上加上注解。


一、自定义注解

代码如下:

import org.springframework.stereotype.Component;

import java.lang.annotation.*;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Component
public @interface SysLog {

    String value() default ""; // 示例:修改密码

    String path() default ""; // 示例:/sys/user/updayePwd
}

二、编写拦截器

代码如下:

import com.alibaba.fastjson.JSON;

@Aspect
@Component
public class SysLogInterceptor {

    @Pointcut("@annotation(com.test.annotation.SysLog)")
    public void execute() {}

    @Around("execute()")
    Object around(ProceedingJoinPoint pj) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Object object = pj.proceed(pj.getArgs());   
        Long executeTime = System.currentTimeMillis() - beginTime; // 执行时长(毫秒)
        String interfaceParams = JSON.toJSONString(pj.getArgs()); // 接口入参
        String result = JSON.toJSONString(object);// 接口返回结果
        String interfaceCode = methodSignature.getName();// 接口名称
        MethodSignature methodSignature = (MethodSignature)pj.getSignature();
        Method targetMethod = methodSignature.getMethod();
        SysLog sysLog = targetMethod.getAnnotation(SysLog.class); // 从接口注解中获取注解信息
        String interfaceName = sysLog.value(); // 接口中文名称
        String interfacePath = sysLog.path(); // 接口路径
        // 建一张表,调用持久化服务存储日志,上述写的信息都可以存储到表中
        
        return object;
    }

    @AfterThrowing(value = "execute()",throwing = "runtimeException")
    public void afterThrowingAdvice(JoinPoint pj, RuntimeException runtimeException){
        System.out.println(pj);
        // 接口调用后异常处理
    }
}

三、在接口上加上注解

代码如下:

    @PostMapping("/test")
    @SysLog(value = "我是接口中文描述", path = "/mytest/test")
    public Map<String, Object> test(@RequestBody Map<String, Object> params) {
        // 接口具体调用,此处是示例,啥也不做,直接返回参数
        return params;
    }

总结

利用自定义注解和aop记录日志的简单实现如上述代码,思路是首先自定义一个注解,然后在想要拦截的接口用自定义注解标注(可以在注解上附带增加一些描述信息),接着编写拦截器类,并以该注解为切点进行拦截,最后在拦截器中提取接口的调用信息,并写入库中。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值