import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
/**
* @author *****
* @description AOP切面来拦截希望记录日志的接口方法
* @date 2024年05月14日 14:34
*/
@Aspect
@Component
@Slf4j
public class LoggingAspect {
// 指定需要拦截的包或类
@Pointcut("execution(* com.*****.***.controller.*.*(..))")
public void webLog() {
}
@Around("webLog()")
public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
// 获取请求的方法签名等信息
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
String className = methodSignature.getDeclaringType().getSimpleName();
String methodName = methodSignature.getName();
// 获取请求的参数值
Object[] args = joinPoint.getArgs();
StringBuilder params = new StringBuilder();
for (Object arg : args) {
params.append(arg).append(",");
}
if (params.length() > 0) {
params.deleteCharAt(params.length() - 1);
}
// 执行方法
Object result = joinPoint.proceed();
// 记录日志
long endTime = System.currentTimeMillis();
log.info("控制器【{}】#方法名【{}】参数: {},耗时: {}ms,结果: {}", className, methodName, params.toString(), (endTime - startTime), result);
return result;
}
}
SpringBoot 集成使用AOP来记录接口调用的入参和出参
最新推荐文章于 2024-06-17 14:48:01 发布