话不多说,直接上代码
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Method;
@Aspect
@Component
@Slf4j
public class LoggingAspect {
@Before("execution(* com.XXXX.controller.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
StringBuilder logStr = new StringBuilder("REQ: ");
//获取swagger方法描述
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
try {
String methodDescription = getAspectLogDescription(joinPoint);
logStr.append("Description: ").append(methodDescription);
} catch (Exception e) {
throw new RuntimeException(e);
}
logStr.append(", Request URL: ").append(requestAttributes.getRequest().getRequestURL().toString())
.append(", Request Method: ").append(requestAttributes.getRequest().getMethod())
.append(", Request Args :").append( JSONUtil.toJsonStr(joinPoint.getArgs()));
log.info(logStr.toString());
}
@AfterReturning(value = "execution(* com.videofinance.demo.controller.*.*(..))",returning="result")
public void afterReturning(JoinPoint joinPoint, Object result){
StringBuilder logStr = new StringBuilder("RESP: ");
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
logStr.append("Request URL: ").append(requestAttributes.getRequest().getRequestURL().toString())
.append(", Request Method: ").append(requestAttributes.getRequest().getMethod())
.append(", RESULT: ").append(result);
log.info(logStr.toString());
}
/**
* 获取切面注解的描述
*
* @param joinPoint 切点
* @return 描述信息
* @throws Exception
*/
public String getAspectLogDescription(JoinPoint joinPoint)
throws Exception {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = Class.forName(targetName);
Method[] methods = targetClass.getMethods();
StringBuilder description = new StringBuilder("");
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
description.append(method.getAnnotation(ApiOperation.class).value());
break;
}
}
}
return description.toString();
}
@AfterThrowing(pointcut = "execution(* com.XXXX.controller.*.*(..))", throwing = "ex")
public void logAfterThrowing(JoinPoint joinPoint, Throwable ex) {
log.error("Exception in method: " + joinPoint.getSignature().getName() + ". Exception message: " + ex.getMessage());
}
}