笔者的日志想带上执行的方法的中文名(自定义),于是决定使用AOP的方式来对自己的日志进行特殊的处理。
1.首先先附上自定义的注解:
import java.lang.annotation.*;
/**
* 自定义方法名注解
* 便于日志处理的时候获取方法名
*
* @author Cocowwy
* @create 2021-05-05-11:29
*/
@Target(ElementType.METHOD)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodName {
String value() default "";
}
注意作用目标是在方法上。
2.接下来给自己controller层上的方法加上自定义的注解。
/**
* 用户成功支付订单
*
* @param request
* @return
*/
@MethodName("用户付款订单成功")
@PostMapping("/push/paidOrder")
public void paidOrder(PaidOrderRequest request) {
meiTuanPushService.paidOrder(request);
}
我们这里的MethodName注解写上我们的中文名即可。
3.开始写我们的切面(敏感代码做模糊化处理)
/**
* 请求记录日志记录,便于排查问题
*
* @author Cocowwy
* @create 2021-05-05-11:15
*
*/
@Aspect
@Component
@Slf4j
public class RequestLogAspect {
/**
* 切入点 排除自配送接口
*/
@Pointcut("execution(public * com.xxxx.xxxxx.service.controller..*.*(..))" +
"&&!execution(public * com.xxxx.takeout.xxxxx.controller.xxxxxxController.xxxxxxxxx(..))")
//第二行execution 指定不进行AOP的方法
private void pointCut() {
}
/**
* 配置环绕切面
*
* @param joinPoint
* @return
*/
@Around("pointCut()")
public Object aroundMethod(ProceedingJoinPoint joinPoint) {
String order_id = null;
String methodName = null;
Object[] objects = null;
try {
objects = joinPoint.getArgs();
// 获取订单id 获取MethodName注解的值
order_id = String.valueOf(JSONUtil.parse(objects[0]).getByPath("order_id"));
methodName=((MethodSignature) joinPoint.getSignature()).getMethod().getAnnotation(MethodName.class).value();
log.info("订单id:【{}】,执行【{}】,请求参数为:{}", order_id, methodName, objects);
joinPoint.proceed();
log.info("订单id:【{}】,执行【{}】 成功!", order_id, methodName);
} catch (Throwable e) {
log.error("订单id:【{}】执行方法【{}】失败,接口入参如下:{},异常日志如下:", order_id, methodName, objects, e);
return Result.ERROR;
}
return Result.OK;
}
}