使用springaop实现行为日志,并存储到数据库

一.引入依赖

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

二.创建对应的实体类

blog指定数据库中存储日志的表名

三.自定义注解

四.创建切面类

@Aspect
@Component
public class ServiceLogAspect {
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");

    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Resource
    private LogService logService;

    //1、配置匹配ServiceMonitor注解表达式
    @Pointcut("@annotation(com.anjiplus.template.gaea.business.modules.blog.annotations.ServiceMonitor)")
    public void serviceLog() {}

    @Around(value = "serviceLog()")
    public Object doArount(ProceedingJoinPoint joinPoint) throws Throwable {
        ServiceLog serviceLog = new ServiceLog();
        //2、记录执行时间
        long startTime = System.currentTimeMillis();
        Object result = joinPoint.proceed(joinPoint.getArgs());
        long endTime = System.currentTimeMillis();
        long totalTime = endTime - startTime;
        //3、记录方法名
        String methodName = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName() + "()";
        serviceLog.setOperator(methodName);
        serviceLog.setStartTime(startTime);
        serviceLog.setEndTime(endTime);
        serviceLog.setTotalTime(totalTime);
        logger.info("**********Method:{}, Start:{}, End:{}, Total:{}ms**********",
                methodName, dateFormat.format(startTime), dateFormat.format(endTime), totalTime);
        logService.saveServiceLog(serviceLog);
        return result;
    }
}

 五.只需要在方法上加上 @ILog 注解,并设置它的 value 即可(value 就是描述当前 method 作用)下面我举个例子

当访问menuTree这个接口时,日志会被记录,这个方法的功能是查询,所以我@Log里面的value也写的的查询,也可以写新增,修改,看情况

六.最后保存数据到数据库 service层

 ServiceImpl

 Mapper

 

 


版权声明:本文为zhoupan1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。