最近在优化日志打印内容,能够记录方法参数名及对应值,对现有贴子进行代码优化,贴上代码片段。
package com.zjy.aop;
import java.lang.reflect.Field;
import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
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 com.google.gson.Gson;
import com.google.gson.GsonBuilder;
/**
*
* INTRO : AOP日志---记录方法参数名及对应值(包括对象和基本类型)
*
* @author helloJay
* @since 2017年8月1日
*/
@Component
@Aspect
public class CallController {
Logger logger = Logger.getLogger(CallController.class.getName());
public static Gson gson = new GsonBuilder().serializeNulls().create();
private static String[] types = { "java.lang.Integer", "java.lang.Double", "java.lang.Float", "java.lang.Long",
"java.lang.Short", "java.lang.Byte", "java.lang.Boolean", "java.lang.Char", "java.lang.String", "int",
"double", "long", "short", "byte", "boolean", "char", "float" };
@Pointcut("execution(* com.zjy.controller.*.*(..))")
public void methodCachePointcut() {
}
@Before("methodCachePointcut()")
public void doBefore(JoinPoint joinPoint) throws Exception {
// 此为代码片段
String params = bulidParams(joinPoint) + " ";
// ...
logger.error(params);
}
/**
* 获取方法参数名及对应值
*/
private String bulidParams(JoinPoint joinPoint) throws Exception {
String[] paramNames = getParamNames(joinPoint);
Object[] args = joinPoint.getArgs();
StringBuilder sb = new StringBuilder();
sb.append("(");
for (int k = 0; k < args.length; k++) {
boolean clazzFlag = true;
Object arg = args[k];
if (arg == null) {
continue;
}
sb.append(paramNames[k]);
String typeName = arg.getClass().getTypeName();
for (String type : types) {
if (type.equals(typeName)) {
clazzFlag = false;
sb.append("=").append(argValue(arg)).append(",");
}
}
if (clazzFlag)
sb.append(getFieldsValue(arg));
}
sb.append(")");
return sb.toString();
}
private String[] getParamNames(JoinPoint joinPoint) {
return ((MethodSignature) joinPoint.getSignature()).getParameterNames();
}
private static String argValue(Object arg) {
String argStr = gson.toJson(arg);
return argStr.length() > 256 ? argStr.subSequence(0, 256) + "..." : argStr;
}
/**
* 获取对象中的参数名及对应参数值
*/
private static String getFieldsValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getDeclaredFields();
StringBuilder sb = new StringBuilder();
for (Field field : fields) {
field.setAccessible(true);
try {
field.get(null);// 只能获取静态常量
} catch (NullPointerException e) {
Object objArg = field.get(obj);
if (objArg == null) {
continue;
}
for (String type : types) {
if (field.getType().getName().equals(type)) {
sb.append(field.getName()).append("=").append(argValue(objArg)).append(",");
}
}
}
}
return sb.toString();
}
}
引入jar包
<!-- gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.6.1</version>
</dependency>
<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
打印内容
(personGuid="EB7E0F1DDADE48F9BB75957A6780A608",deviceKey="1324568794658",taskId="80F82B6A6ED44D88B091CE98D6B8D48A",state=4,)
转载自:http://blog.csdn.net/paincupid/article/details/51176149