AOP日志 记录方法参数名及对应值(包括对象和基本类型)

最近在优化日志打印内容,能够记录方法参数名及对应值,对现有贴子进行代码优化,贴上代码片段。

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




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值