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,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务