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); } }