Commit 2a695227 authored by lee_mingzhu's avatar lee_mingzhu

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

parent 67b64bff
...@@ -9,17 +9,14 @@ import javassist.NotFoundException; ...@@ -9,17 +9,14 @@ import javassist.NotFoundException;
import javassist.bytecode.CodeAttribute; import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute; import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo; import javassist.bytecode.MethodInfo;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration; 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. * Created by 11 on 2017/4/20.
...@@ -30,27 +27,27 @@ public class ParamLogAdvice { ...@@ -30,27 +27,27 @@ public class ParamLogAdvice {
private Logger LOGGER = LoggerFactory.getLogger(ParamLogAdvice.class); private Logger LOGGER = LoggerFactory.getLogger(ParamLogAdvice.class);
/**
* 定义切面,拦截InnerController类中的所有方法
*/
@Pointcut("execution(* cn.quantgroup.xyqb.controller.external.user.InnerController.*(..))") @Pointcut("execution(* cn.quantgroup.xyqb.controller.external.user.InnerController.*(..))")
public void logPointCut(){} public void logPointCut(){}
@Around("logPointCut()") /**
public Object printMethodParam(ProceedingJoinPoint pjp) { * 后置通知,方法执行后获取方法的入参信息并打印日志
Object obj = null; * @param jp
try { */
obj = pjp.proceed(); @After("logPointCut()")
} catch (Throwable t) { public void printMethodParam(JoinPoint jp) {
t.printStackTrace(); Object[] params = jp.getArgs();
} String methodName = jp.getSignature().getName();
Object[] params = pjp.getArgs();
String methodName = pjp.getSignature().getName();
String[] paramNames = null; String[] paramNames = null;
try { try {
paramNames = getFieldsName(pjp.getTarget().getClass(), pjp.getTarget().getClass().getName(), methodName); paramNames = getFieldsName(jp.getTarget().getClass(), jp.getTarget().getClass().getName(), methodName);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
StringBuffer buffer = new StringBuffer(); StringBuffer buffer = new StringBuffer();
LOGGER.info("invoke method:{}, method params:{}", pjp.getSignature().getName(), Arrays.toString(params));
if(null != paramNames) { if(null != paramNames) {
for(int i = 0; i < paramNames.length; i ++) { for(int i = 0; i < paramNames.length; i ++) {
buffer.append(paramNames[i]).append(":").append(params[i]).append(" "); buffer.append(paramNames[i]).append(":").append(params[i]).append(" ");
...@@ -58,17 +55,27 @@ public class ParamLogAdvice { ...@@ -58,17 +55,27 @@ public class ParamLogAdvice {
String logInfo = buffer.toString().substring(0, buffer.toString().length() - 1); String logInfo = buffer.toString().substring(0, buffer.toString().length() - 1);
LOGGER.info("调用方法,方法名:{} , 方法参数:{}", methodName, logInfo); 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 { private static String[] getFieldsName(Class cls, String clazzName, String methodName) throws NotFoundException {
//获取class定义的容器
ClassPool pool = ClassPool.getDefault(); ClassPool pool = ClassPool.getDefault();
ClassClassPath classPath = new ClassClassPath(cls); ClassClassPath classPath = new ClassClassPath(cls);
pool.insertClassPath(classPath); pool.insertClassPath(classPath);
//从容器中获取编译后的class
CtClass cc = pool.get(clazzName); CtClass cc = pool.get(clazzName);
//反射获取指定方法
CtMethod cm = cc.getDeclaredMethod(methodName); CtMethod cm = cc.getDeclaredMethod(methodName);
MethodInfo methodInfo = cm.getMethodInfo(); MethodInfo methodInfo = cm.getMethodInfo();
CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); CodeAttribute codeAttribute = methodInfo.getCodeAttribute();
LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);
if (attr == null) { 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