主要依赖:implementation 'org.springframework.boot:spring-boot-starter-aop'
创建自定义日志注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomLog {
/**
* 操作接口说明
*/
String state() default "";
/**
* 是否保存请求的参数
*/
boolean isSaveRequestData() default true;
/**
* 是否保存响应的参数
*/
boolean isSaveResponseData() default true;
}
创建切面
@Aspect
@Component
@Slf4j
public class LogAspect {
@Autowired
private IOperationsService operationsService;
@Pointcut("@annotation(tech.test.annotation.CustomLog)")
public void logPointCut() {}
/**
* 处理完请求后执行
*/
@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
handleLog(joinPoint, jsonResult);
}
/**
* 处理日志
*/
protected void handleLog(final JoinPoint joinPoint, Object jsonResult) {
// 处理入参
String args = argsArrayToString(joinPoint.getArgs());
JSONObject jsonObject = JSONObject.parseObject(args);
String serialNumber = JSON.toJSONString(jsonObject.get("serialNumber"));
// 获取自定义注解上的参数
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
CustomLog customLog = method.getAnnotation(CustomLog.class);
// 所需日志信息保存到数据库
Operations operations = new Operations();
operations.setOperatorId(SecurityContextHolderUtil.userId());
operations.setOperatorName(SecurityContextHolderUtil.userName());
operations.setMethod(method.getName());
operations.setOperation(customLog.state());
if (customLog.isSaveRequestData()) {
operations.setRequestData(args);
}
if (customLog.isSaveResponseData()) {
operations.setResponseData(JSON.toJSONString(jsonResult));
}
operationsService.insertOperations(operations);
}
/**
* 组装入参
*/
private String argsArrayToString(Object[] paramsArray) {
String params = "";
if (paramsArray != null && paramsArray.length > 0) {
for (int i = 0; i < paramsArray.length; i++) {
if (!isFilterObject(paramsArray[i])) {
Object jsonObj = JSON.toJSON(paramsArray[i]);
params += jsonObj.toString() + " ";
}
}
}
if (("").equals(params.trim())) {
params = "无入参";
}
return params.trim();
}
/**
* 判断是否需要过滤的对象。
*/
public boolean isFilterObject(final Object o) {
return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
}
}