转载:https://blog.csdn.net/mingzq123/article/details/130226750
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_log
-- ----------------------------
DROP TABLE IF EXISTS `sys_log`;
CREATE TABLE `sys_log` (
`id` int NOT NULL AUTO_INCREMENT,
`create_user` varchar(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL,
`create_time` datetime NOT NULL,
`class_name` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`method_name` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`method_params` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`return_value` varchar(256) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL,
`cost_time` mediumtext CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci COMMENT = '日志信息类' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OperatorLog {
private Integer id; //ID
private String createUser; //操作人ID
private LocalDateTime createTime; //操作时间
private String className; //操作类名
private String methodName; //操作方法名
private String methodParams; //操作方法参数
private String returnValue; //操作方法返回值
private Long costTime; //操作耗时
public OperatorLog(String createUser, LocalDateTime createTime, String className, String methodName, String methodParams, String returnValue, Long costTime) {
this.createUser = createUser;
this.createTime = createTime;
this.className = className;
this.methodName = methodName;
this.methodParams = methodParams;
this.returnValue = returnValue;
this.costTime = costTime;
}
}
Mapper
@Mapper
public interface LogMapper {
@Insert("insert into sys_log (create_user,create_time,class_name,method_name,method_params,return_value,cost_time)" +
"values (#{createUser},#{createTime},#{className},#{methodName},#{methodParams},#{returnValue},#{costTime});")
void addLog(OperatorLog log);
}
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OperatorLog {
}
导入AOP的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
自定义AOP
@Slf4j
@Configuration
@Aspect
public class CustomizationAop {
@Autowired
HttpServletRequest request;
@Autowired
EmpMapper empMapper;
@Autowired
LogMapper logMapper;
@Around("@annotation(com.huang.anno.OperatorLog)")
public Object around(ProceedingJoinPoint p) throws Throwable{
//获取token
String token = request.getHeader("token");
Claims claims = JwtUtils.parseJwt(token);
//获取操作人名字
Integer id = (Integer) claims.get("id");
String operatorName = empMapper.getOneById(id).getName();
//获取现在时间
LocalDateTime now = LocalDateTime.now();
//获取类名
String className = p.getTarget().getClass().getName();
//获取方法名
String methodName = p.getSignature().getName();
//获取参数名
Object[] args = p.getArgs();
String params = Arrays.toString(args);
//方法执行前时间
long begin = System.currentTimeMillis();
//方法执行
Object result = p.proceed();
//方法执行后时间
long end = System.currentTimeMillis();
//获取执行时间
long costTime = end - begin;
//方法返回值
String returnValue = JSONObject.toJSONString(result);
if (returnValue.length()>255) {
returnValue = returnValue.substring(0, 255);
}
OperatorLog operatorLog = new OperatorLog(operatorName, now, className, methodName, params, returnValue, costTime);
logMapper.addLog(operatorLog);
log.info("日志记录:{}",operatorLog);
return result;
}
}
实现
@GetMapping
@OperatorLog
public Result page(@RequestParam(required = false) String name,
@RequestParam(required = false) Short gender,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end,
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "10") Integer pageSize){
PageBean pageBean = empService.page(name,gender,begin,end,page,pageSize);
return Result.success(pageBean);
}