package com.cinc.ecmp.client;
import com.cinc.ecmp.enums.BackResultEnum;
import com.cinc.ecmp.exception.BasException;
import com.cinc.ecmp.utils.JsonUtil;
import com.cinc.ecmp.vo.BackResult;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
/**
* @Author: hhr
* @Despriction: 调用其他服务的日志打印
* @CreatedTime: 2019/8/13 14:01
* @ModifyBy:
* @ModifyTime:
* @ModifyDespriction:
* @Version: V1.0.0
*/
@Slf4j
@Component
@Aspect
public class ClientLogRecordAspect {
private final String pointCutStr = "execution(* com.cinc.ecmp.client..*.*(..))";
/**
* 定义切点
*/
@Pointcut(pointCutStr)
public void executeService(){
}
@Before("executeService()")
public void doBefore(JoinPoint point) throws Throwable{
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) point.getSignature();
String declar = signature.getName();
//获取切入点所在的方法
Method method = signature.getMethod();
log.info("============ 请求{}/{}开始 start:============",request.getRequestURI(),declar);
//获取请求的类名
String className = point.getTarget().getClass().getName();
//获取请求的方法名
String methodName = method.getName();
//请求的参数
Object[] args = point.getArgs();
//将参数所在的数组转换成json
String params = JsonUtil.objectToJsonStr(args);
log.info("{} 参数params:{}", declar,params);
}
@AfterReturning(value = pointCutStr,returning = "resultInfo")
public void doAfterReturn(JoinPoint point,Object resultInfo) throws Throwable{
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//从切面织入点处通过反射机制获取织入点处的方法
MethodSignature signature = (MethodSignature) point.getSignature();
String declar = signature.getName();
//获取切入点所在的方法
Method method = signature.getMethod();
log.info("{}返回参数params:{}",declar, JsonUtil.objectToJsonStr(resultInfo));
BackResult backResult = (BackResult)resultInfo;
if (null == backResult || !BackResultEnum.SUCCESS.getCode().equals(backResult.getCode())){
throw new BasException("ERROR","调用" + declar + "失败");
}
log.info("============ 请求{}/{}结束 end ============" , request.getRequestURI(),declar);
}
}