aop日志记录

 依赖

<!--添加依赖-->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

        <!--aop-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

注解

@Retention(RetentionPolicy.RUNTIME) // 保留到运行阶段
@Target({ElementType.METHOD}) // 只能加方法上
public @interface LogAnno {
    String methodDesc() default ""; // 方法用途
}

实现:

// 记录日志的切面
@Aspect
@Component
public class LogAspect {
    @Autowired
    private HttpServletRequest request;
    @Autowired
    private OperateLogMapper operateLogMapper;

    // 切点 (标注LogAnno注解的方法都被切中)
    @Pointcut("@annotation(com.itheima.anno.LogAnno)")
    public void pt() {
    }

    // 环绕通知
    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        OperateLog operateLog = new OperateLog();
        // 获取类名
        operateLog.setClassName(pjp.getTarget().getClass().getName());
        // 获取方法参数
        operateLog.setMethodParams(Arrays.toString(pjp.getArgs()));

        // org.aspectj.lang.reflect.MethodSignature
        MethodSignature ms = (MethodSignature) pjp.getSignature();
        // 获取方法名
        operateLog.setMethodName(ms.getMethod().getName());

        LogAnno logAnno = ms.getMethod().getAnnotation(LogAnno.class);
        // 获取方法描述
        operateLog.setMethodDesc(logAnno.methodDesc());

        String token = request.getHeader("token");
        Claims claims = JwtUtils.parseJWT(token);
        // 拿到用户id
        Integer id = claims.get("id", Integer.class);
        operateLog.setOperateUser(id);
        // 操作时间
        operateLog.setOperateTime(LocalDateTime.now());

        long begin = System.currentTimeMillis();
        Object object = pjp.proceed();
        long end = System.currentTimeMillis();
        // 方法执行时间
        operateLog.setCostTime(end - begin);
        // 方法返回信息
        operateLog.setReturnValue(object.toString());

        // 落库
        operateLogMapper.insert(operateLog);
        return object;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值