Commit 2a695227 authored by lee_mingzhu's avatar lee_mingzhu

添加日志切面,拦截打印所有InnerApiController类中的所有方法的参数

parent 67b64bff
......@@ -9,17 +9,14 @@ import javassist.NotFoundException;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.w3c.dom.Attr;
import java.util.Arrays;
import java.util.UUID;
/**
* Created by 11 on 2017/4/20.
......@@ -30,27 +27,27 @@ public class ParamLogAdvice {
private Logger LOGGER = LoggerFactory.getLogger(ParamLogAdvice.class);
/**
* 定义切面,拦截InnerController类中的所有方法
*/
@Pointcut("execution(* cn.quantgroup.xyqb.controller.external.user.InnerController.*(..))")
public void logPointCut(){}
@Around("logPointCut()")
public Object printMethodParam(ProceedingJoinPoint pjp) {
Object obj = null;
try {
obj = pjp.proceed();
} catch (Throwable t) {
t.printStackTrace();
}
Object[] params = pjp.getArgs();
String methodName = pjp.getSignature().getName();
/**
* 后置通知,方法执行后获取方法的入参信息并打印日志
* @param jp
*/
@After("logPointCut()")
public void printMethodParam(JoinPoint jp) {
Object[] params = jp.getArgs();
String methodName = jp.getSignature().getName();
String[] paramNames = null;
try {
paramNames = getFieldsName(pjp.getTarget().getClass(), pjp.getTarget().getClass().getName(), methodName);
paramNames = getFieldsName(jp.getTarget().getClass(), jp.getTarget().getClass().getName(), methodName);
} catch (Exception e) {
e.printStackTrace();
}
StringBuffer buffer = new StringBuffer();
LOGGER.info("invoke method:{}, method params:{}", pjp.getSignature().getName(), Arrays.toString(params));
if(null != paramNames) {
for(int i = 0; i < paramNames.length; i ++) {
buffer.append(paramNames[i]).append(":").append(params[i]).append(" ");
......@@ -58,17 +55,27 @@ public class ParamLogAdvice {
String logInfo = buffer.toString().substring(0, buffer.toString().length() - 1);
LOGGER.info("调用方法,方法名:{} , 方法参数:{}", methodName, logInfo);
}
return obj;
}
/**
* 利用javassist获取方法的参数名称
* @param cls
* @param clazzName
* @param methodName
* @return
* @throws NotFoundException
*/
private static String[] getFieldsName(Class cls, String clazzName, String methodName) throws NotFoundException {
//获取class定义的容器
ClassPool pool = ClassPool.getDefault();
ClassClassPath classPath = new ClassClassPath(cls);
pool.insertClassPath(classPath);
//从容器中获取编译后的class
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);
if (attr == null) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment