2KB项目,专业的源码交易网站 帮助 收藏 每日签到

使用 AspectJ 来记录所有方法参数和返回值

  • 时间:2019-01-23 18:43 编辑:2KB 来源:2KB.COM 阅读:390
  • 扫一扫,手机访问
  • 分享
摘要: 英文原文:Usi
英文原文:Using AspectJ to log all methods parameters and return values during application runtime 使用如下的 aspect 工具类:
package com.myapp.util;

import java.lang.reflect.Field;
import java.util.List;

import org.apache.log4j.Logger;

public final class AspectUtils {

	private static final Logger logger = Logger.getLogger(AspectUtils.class);

	private AspectUtils() {

	}

	public static Logger getLogger(org.aspectj.lang.JoinPoint joinPoint) {
		try {
			@SuppressWarnings("rawtypes")
			Class declaringType = joinPoint.getSignature().getDeclaringType();
			Field loggerField = declaringType.getDeclaredField("logger");
			loggerField.setAccessible(true);
			return (Logger) loggerField.get(null);
		} catch (NoSuchFieldException e) {

		} catch (Exception e) {

		}
		return logger;
	}

	public static void logParamValues(StringBuilder logLine,
			String[] paramNames, Object[] paramValues) {
		for (int i = 0; i < paramValues.length; i++) {
			logLine.append(paramNames[i]).append("=")
					.append(toString(paramValues[i]));
			if (i < paramValues.length - 1)
				logLine.append(", ");
		}
	}

	@SuppressWarnings("rawtypes")
	public static String toString(Object object) {
		if (object == null)
			return "<null>";
		else if (object instanceof String) {
			if(((String) object).length() > 100)
				return ((String) object).substring(0, 100) + "...[more]";
			else return (String) object;
		}
		else if (object instanceof Long)
			return ((Long) object).toString();
		else if (object instanceof Boolean)
			return ((Boolean) object).toString();
		else if (object instanceof Double)
			return ((Double) object).toString();
		else if (object instanceof Integer)
			return ((Integer) object).toString();
		else if (object instanceof List)
			return "items{" + ((List) object).size() + "}";
		else
			return "object";
	}
}


这个工具类包含三个方法,getLogger 返回 logger 属性。
第二个方法 “logParamValues” 对日志进行格式化处理,格式为:“methodName(param1=xxxx, param2=xxxx)”
第三个方法是 “toString” 用来将对象变成字符串,但内容跟原本的 toString 不同。

使用如下枚举类型来防止对某些特定方法进行记录,可直接使用 @NO_LOG 来忽略方法:

package com.myapp.util;

public @interface NO_LOG {

}

下面就是 aspect 文件,别忘了在你类路径中配置 AspectJ:

import java.util.List;

import org.aspectj.lang.reflect.CodeSignature;

import com.myapp.util.AspectUtils;;

public aspect ServicesLogger {

	pointcut logMethod(): 
		execution(!@com.myapp.util.NO_LOG *  com.myapp.services..* (..));

	before(): logMethod() {
		Object[] paramValues = thisJoinPoint.getArgs();
		String[] paramNames = ((CodeSignature) thisJoinPointStaticPart
				.getSignature()).getParameterNames();
		StringBuilder logLine = new StringBuilder(thisJoinPointStaticPart
				.getSignature().getName()).append("(");
		if (paramNames.length != 0)
			AspectUtils.logParamValues(logLine, paramNames, paramValues);
		logLine.append(") - started");
		AspectUtils.getLogger(thisJoinPoint).info(logLine.toString());
	}

	@SuppressWarnings("rawtypes")
	after() returning(Object r): logMethod(){

		if (r != null && (!(r instanceof List) || ((List) r).size() != 0)) {
			StringBuilder rv = new StringBuilder("Return Value : ");
			rv.append(AspectUtils.toString(r));
			AspectUtils.getLogger(thisJoinPoint).info(rv.toString());
		}

		Object[] paramValues = thisJoinPoint.getArgs();
		String[] paramNames = ((CodeSignature) thisJoinPointStaticPart
				.getSignature()).getParameterNames();
		StringBuilder logLine = new StringBuilder(thisJoinPointStaticPart
				.getSignature().getName()).append("(");
		if (paramNames.length != 0)
			AspectUtils.logParamValues(logLine, paramNames, paramValues);
		logLine.append(") - finished");
		AspectUtils.getLogger(thisJoinPoint).info(logLine.toString());
	}
}
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。


2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务

  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【计算机/互联网|】Nginx出现502错误(2020-01-20 21:02)
【计算机/互联网|】网站运营全智能软手V0.1版发布(2020-01-20 12:16)
【计算机/互联网|】淘宝这是怎么了?(2020-01-19 19:15)
【行业动态|】谷歌关闭小米智能摄像头,因为窃听器显示了陌生人家中的照片(2020-01-15 09:42)
【行业动态|】据报道谷歌新闻终止了数字杂志,退还主动订阅(2020-01-15 09:39)
【行业动态|】康佳将OLED电视带到美国与LG和索尼竞争(2020-01-15 09:38)
【行业动态|】2020年最佳AV接收机(2020-01-15 09:35)
【行业动态|】2020年最佳流媒体设备:Roku,Apple TV,Firebar,Chromecast等(2020-01-15 09:31)
【行业动态|】CES 2020预览:更多的流媒体服务和订阅即将到来(2020-01-08 21:41)
【行业动态|】从埃隆·马斯克到杰夫·贝佐斯,这30位人物定义了2010年代(2020-01-01 15:14)
联系我们

Q Q: 7090832

电话:400-0011-990

邮箱:7090832@qq.com

时间:9:00-23:00

联系客服
商家入住 服务咨询 投拆建议 联系客服
0577-67068160
手机版

扫一扫进手机版
返回顶部