package com.zebra.carcloud.trip.aspect; import java.lang.reflect.Method; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import javassist.ClassClassPath; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; import javassist.NotFoundException; import javassist.bytecode.CodeAttribute; import javassist.bytecode.LocalVariableAttribute; import javassist.bytecode.MethodInfo; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.After; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import com.zebra.carcloud.trip.annotation.ParamAnonymous; import com.zebra.carcloud.trip.utils.ReqIdUtil; import com.zebra.carcloud.trip.utils.StringUtil; @Aspect @Component @Order(100) public class LogAspect { static Logger logger = LoggerFactory.getLogger(LogAspect.class); @Pointcut("execution(* com.zebra.carcloud.trip.service.*.*.*(..))") public void executeService(){ } @Before("executeService()") public void logBefore(JoinPoint joinPoint) { try { if(ReqIdUtil.getReqId() == null) { ReqIdUtil.setReqId(ReqIdUtil.getReqIdForService()); } StringBuilder startLog = new StringBuilder(joinPoint.getTarget().getClass().getName()) .append(" ****").append(joinPoint.getSignature().getName()).append(" 方法执行开始...**** REQ_ID:").append(ReqIdUtil.getReqId()).append(" 参数为:"); //获取拦截接口方法 MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); String[] anonymousParams = null; if (method.isAnnotationPresent(ParamAnonymous.class)) { ParamAnonymous data = method.getAnnotation(ParamAnonymous.class); anonymousParams = data.params(); } String[] paramName = getFieldsName(this.getClass(),joinPoint.getTarget().getClass().getName(),methodSignature.getMethod().getName()); Map<String,Object> paramMap = new HashMap<String,Object>(); int idx = 0; Object[] values = joinPoint.getArgs(); for(String name : paramName) { if(anonymousParams == null || Arrays.binarySearch(anonymousParams, name) < 0) { paramMap.put(name,values[idx++]); } } logger.info(startLog.append(StringUtil.getJsonByObj(paramMap)).toString()); startLog = null; } catch(Exception e) { } } @After("executeService()") public void logAfter(JoinPoint joinPoint) { logger.info(new StringBuilder(joinPoint.getTarget().getClass().getName()) .append(" ****").append(joinPoint.getSignature().getName()).append(" 方法执行结束...**** REQ_ID:").append(ReqIdUtil.getReqId()).toString()); } /** * 得到方法参数的名称 * @throws NotFoundException */ private static String[] getFieldsName(Class<?> cls, String clazzName, String methodName) throws NotFoundException{ ClassPool pool = ClassPool.getDefault(); ClassClassPath classPath = new ClassClassPath(cls); pool.insertClassPath(classPath); CtClass cc = pool.get(clazzName); CtMethod cm = cc.getDeclaredMethod(methodName); MethodInfo methodInfo = cm.getMethodInfo(); CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); String[] paramNames = new String[cm.getParameterTypes().length]; int pos = Modifier.isStatic(cm.getModifiers()) ? 0 : 1; for (int i = 0; i < paramNames.length; i++){ paramNames[i] = attr.variableName(i + pos); } return paramNames; } }
2.