AOP 记录 Log 的完整源代码 ,Java Spring

import java.time.LocalDateTime;
import java.util.Arrays;

@Slf4j
@Aspect
@Component
public class LogAspect {

    @Autowired
    private HttpServletRequest request;     // 获得当前请求对象

    @Autowired
    private OperateLogMapper operateLogMapper;

    @Around("@annotation(biz.baijing.annotation.OpLog)")
    public Object insertLogAround(ProceedingJoinPoint joinPoint) throws Throwable {

        // 操作人 id = 登录 id —— 解析 jwt
        String jwt = request.getHeader("token");
        Claims claims = JwtsToken.parseJwt(jwt);
        Integer operateUser = (Integer) claims.get("id");

        // 操作时间 = 当前时间
        LocalDateTime operateTime = LocalDateTime.now();
        // 操作 类名 / 参数 / 返回值
        String className = joinPoint.getTarget().getClass().getName();       // 获取类名
        String methodName = joinPoint.getSignature().getName();
        String methodParams = Arrays.toString(joinPoint.getArgs());

        long start = System.currentTimeMillis();

        Object proceedResult = joinPoint.proceed();                       // 返回值
        String returnValue = JSONObject.toJSONString(proceedResult);

        long end = System.currentTimeMillis();
        // 操作耗时
        long costTime = end - start;
        // 操作日志入库
        OperateLog operateLog = new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);
        operateLogMapper.insert(operateLog);

        log.info("AOP记录操作日志 {}",operateLog);

        return proceedResult;
    }
}

生成数据库的代码

create table operate_log(
    id int unsigned primary key auto_increment comment 'ID',
    operate_user int unsigned comment '操作人ID',
    operate_time datetime comment '操作时间',
    class_name varchar(100) comment '操作的类名',
    method_name varchar(100) comment '操作的方法名',
    method_params varchar(1000) comment '方法参数',
    return_value varchar(2000) comment '返回值',
    cost_time bigint comment '方法执行耗时, 单位:ms'
) comment '操作日志表';

创建的 annotation 目录的标记目标类或方法的类

package biz.baijing.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OpLog {

}

标记目标类

    /**
     * 增加部门
     * @param dept
     * @return
     */
    // 增加部门,前端传递的是 JSON 格式数据,通过 @RequestBody 接收 JSON 数据
//    @PostMapping("/depts")
    @OpLog
    @PostMapping
    public Result add(@RequestBody Dept dept) {
        log.info("新增部门:{}", dept);
        deptService.add(dept);
        return Result.success();
    }

    @OpLog            // 标记的 annotation 注解
    @PutMapping
    public Result update(@RequestBody Dept dept) {
        log.info("修改部门名称:{}", dept);
        deptService.update(dept);
        return Result.success();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值