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();
}