AOP记录操作日志

创建数据库表

-- 操作日志
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 '操作日志表';

引入APO依赖

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

 

创建数据库对应的类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class OperateLog {
    private Integer id;
    private Integer operateUser;// 操作人员的id
    private LocalDateTime operateTime;//操作时间
    private String className; // 操作类名
    private String methodName ; //操作方法
    private String methodParams; //方法参数
    private String returnValue; //返回值
    private Long costTime; //操作耗时

创建注解类

package com.it.anno;


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 Log {

}

创建AOP类

package com.it.aop;


import com.alibaba.fastjson.JSONObject;
import com.it.mapper.OperateLogMapper;
import com.it.pojo.OperateLog;
import com.it.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDateTime;
import java.util.Arrays;

@Slf4j
@Component
@Aspect //切面类
public class LogAspect {

    @Autowired
    private HttpServletRequest response;
    @Autowired
    private OperateLogMapper operateLogMapper;


    @Around("@annotation(com.it.anno.Log)")
    public Object recordLog(ProceedingJoinPoint joinPoint) throws Throwable{

        //id 自增
        //操作人的id
       String jwt= response.getHeader("token");
        Claims claims = JwtUtils.parseJWT(jwt);
        Integer operateUser =(Integer) claims.get("id");

        //操作时间
        LocalDateTime operateTime = LocalDateTime.now();

        //操作类名
        String className = joinPoint.proceed().getClass().getName();

        //操作方法名
        String methodName = joinPoint.getSignature().getName();

        //操作方法参数
        Object[] args = joinPoint.getArgs();
        String methodParams = Arrays.toString(args);

        //记录时间 (开始)
        long begin = System.currentTimeMillis();

        //调用原始的目标方法运行
        Object proceed = joinPoint.proceed();
        //记录时间 (结束)
        long end = System.currentTimeMillis();

        //方法返回值
        String returnValue = JSONObject.toJSONString(proceed);

        //耗时时间
        long costTime = end - begin;



        //记录日志
        OperateLog operateLog=new OperateLog(null,operateUser,operateTime,className,methodName,methodParams,returnValue,costTime);
        operateLogMapper.insert(operateLog);
        log.info("AOP记录操作日志:{}",operateLog);
        return proceed;
    }
}

 每个方法上把自定义的@Log注解引入进来

 /*根据ID删除部门*/
    //@DeleteMapping("/{id}")
    @Log
    @DeleteMapping("/depts/{id}")
    public Result delete( @PathVariable Integer id) throws Exception {
        log.info("根据ID删除部门:{}",id);
        deptservec.delete(id);
        return Result.success();

    }
        //新增部门
   // @PostMapping
    @Log
       @PostMapping ("/depts")
    public Result add( @PathVariable Dept dept) {
        log .info("新增部门:{}",dept);
            deptservec.add(dept);
       return  Result.success();
    }

 

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用AOP(面向切面编程)来记录批量插入操作AOP可以帮助您在不修改原始代码的情况下,通过在关键点织入横切关注点来实现日志记录。 首先,您需要创建一个切面,用于记录插入操作日志。在该切面中,您可以定义一个通知(Advice),在执行批量插入操作之前和之后执行。 以下是一个示例切面的代码: ```java import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class BatchInsertAspect { @Before("execution(* com.example.dao.BatchInsertDAO.insert(..))") public void beforeInsert(JoinPoint joinPoint) { System.out.println("开始批量插入操作..."); // 在这里可以记录日志或执行其他操作 } @After("execution(* com.example.dao.BatchInsertDAO.insert(..))") public void afterInsert(JoinPoint joinPoint) { System.out.println("批量插入操作完成。"); // 在这里可以记录日志或执行其他操作 } } ``` 在上述示例中,切面类被注解为`@Aspect`,并且使用`@Before`和`@After`注解定义了两个通知方法。`@Before`通知会在执行批量插入操作之前被调用,而`@After`通知会在执行批量插入操作之后被调用。您可以根据实际需求选择适合的通知类型。 请注意,上述示例假设您的批量插入操作在名为`BatchInsertDAO`的DAO类中。您需要根据您的实际情况修改切点表达式(Pointcut Expression)以匹配您的批量插入方法。 最后,确保将切面类纳入到Spring的组件扫描范围中,以便Spring能够自动检测并应用切面。 通过使用上述示例切面,您可以在批量插入操作之前和之后记录日志或执行其他操作。这样,您可以方便地对批量插入操作进行监控和追踪。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值