基于AOP(面向切面)记录操作日志
一 、系统服务中的日志存储设计
pojo 逻辑实现
创建Log对象,基于此对象封装用户行为日志
package com.jt.system.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 基于此对象封装用户行为日志
* 谁在什么时间执行了什么操作,访问了什么方法,传递了什么参数,访问时长是多少.
*/
@Data
@TableName("tb_logs")
public class Log implements Serializable {
private static final long serialVersionUID = 3054471551801044482L;
@TableId(type = IdType.AUTO)
private Long id;
private String username;
private String operation;
private String method;
private String params;
private Long time;
private String ip;
@TableField("createdTime")
private Date createdTime;
private Integer status;
private String error;
}
dao 逻辑实现
package com.jt.system.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.system.pojo.Log;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户行为日志数据层对象
*/
@Mapper
public interface LogMapper extends BaseMapper<Log> {
//有自己特有方法时,可在这里添加
}
创建测试类测试将日志持久化到数据库
package com.jt;
import com.jt.system.dao.LogMapper;
import com.jt.system.pojo.Log;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Date;
@SpringBootTest
public class LogMapperTests {
@Autowired
private LogMapper logMapper;
@Test
void testInsert(){
//构建用户行为日志对象(基于此对象存储一些用户行为日志,先用假数据)
Log log = new Log();
log.setUsername("cgb2107");
log.setIp("10.10.10.10");
log.setOperation("查询资源");
log.setMethod("pkg.ResourceController.doSelect");
log.setParams("");
log.setStatus(1);
log.setTime(100L);
log.setCreatedTime(new Date());
//将日志持久化到数据库
logMapper.insert(log);
}
}
service 逻辑实现
service接口
package com.jt.system.service;
import com.jt.system.pojo.Log;
/**
* 用户行为日志业务逻辑接口定义
*/
public interface LogService {
/**
* 保存用户行为日志
* @param log
*/
void insertLog(Log log);
}
serviceImpl实现类
package com.jt.system.service;
import com.jt.system.dao.LogMapper;
import com.jt.system.pojo.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class LogServiceImpl implements LogService{
@Autowired
private LogMapper logMapper;
/**
* @Async注解描述的方法,底层会异步执行
* 不由web服务线程执行,而是交给spring自带的线程池中的线程去执行
* (但是@Async注解,要想起作用,有个前提: 需要在启动类上添加异步执行注解@EnableAsync)
* 优点: 不会长时间阻塞web服务(tomcat)线程
* @param log
*/
@Async
@Override
public void insertLog(Log log) {
logMapper.insert(log);
}
}
controller 逻辑实现
package com.jt.system.controller;
import com.jt.system