现在做项目遇到个事 第一期的项目日志记录不是很详细倒致后期维护很烦人 现在开始做第二期了想把日志服务写得完善点想记录一个流程的调用轨迹和传参的值的内容 没有想出好的办法来 请高手们帮忙下 。或者是在调方法时把传入方法的形参给打印出来。如public void getUserInfo(int userId,String username); 这个方法在调用的时候我想把userId和username打印出来 不是通过在方法体里面写一个函数print(userId,username)这种方法实现 因为一个项目方法很多 要这样在方法体内写的话工作量很大 或有没有别的方法比如在方法体里面直接调一个函数print();或print(this)这类的方法实现 希望在调用print这个函数时需要传的形参是不变的。高手们来帮忙!!@!!
问题补充
星期6难道都莫有人来了啊
问题补充
不好意思 确实没描述清楚 谢谢大家
12条回答 默认 最新
- iteye_7245 2011-12-07 01:36关注
几个项目中,一直在用的记录调用请求参数,以及返回结果,时间等。
能用就凑活用吧
[code="java"]
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.AbstractCollection;
import java.util.AbstractMap;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.lang.ClassUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;/**
-
通过拦截器记录一下调用event事件的相关参数和返回结果
*/
public class LogInterceptor implements MethodInterceptor {private static final String DATA_FORMAT = "yyyy-MM-dd HH:mm:ss.sss";
private static String MESSAGE = "\n=======================================\n[Class:{0} , Method:{1} , time:{2} , take:{3}ms]\n{4}Result\r\t{5}\n=======================================";public Object invoke(MethodInvocation methodInvocation) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = null;
try {
result = methodInvocation.proceed();
} catch (Exception e) {
dump(methodInvocation, e, System.currentTimeMillis() - startTime);// 记录异常信息
throw e;
}
// 记录异常信息
dump(methodInvocation, result, System.currentTimeMillis() - startTime); // 记录正常结果信息
return result;
}/**
- 取得对应的logger
- @param obj */ protected Logger getLogger(Class obj) { return LoggerFactory.getLogger(obj); }
/**
- 记录请求信息
- @param methodInvocation
-
@param take
*/
private void dump(MethodInvocation methodInvocation, Object result, long take) {
// 取得日志打印对象
Logger log = getLogger(methodInvocation.getMethod().getDeclaringClass());
Object[] args = methodInvocation.getArguments();
StringBuffer buffer = getArgsString(args);if (log.isInfoEnabled()) {
String className = ClassUtils.getShortClassName(methodInvocation.getMethod().getDeclaringClass());
String methodName = methodInvocation.getMethod().getName();
String resultStr = getResultString(result);String now = new SimpleDateFormat(DATA_FORMAT).format(new Date()); log.info(MessageFormat.format(MESSAGE, new Object[] { className, methodName, now, take, buffer.toString(), resultStr }));
}
}
/**
- 取得结果字符串
- @param result
-
@return
*/
protected String getResultString(Object result) {
if (result == null) {
return StringUtils.EMPTY;
}if (result instanceof Map) { // 处理map
return getMapResultString((Map) result);
} else if (result instanceof List) {// 处理list
return getListResultString((List) result);
} else if (result.getClass().isArray()) {// 处理array
return getArrayResultString((Object[]) result);
} else {
// 直接处理string
return ObjectUtils.toString(result, StringUtils.EMPTY).toString();
// return ToStringBuilder.reflectionToString(result, ToStringStyle.SIMPLE_STYLE);
}
}
/**
- 取得map的string,自定义的主要目的:针对value中数组数据的toString处理, copy from {@link AbstractMap}
- @param result
- @return */ private String getMapResultString(Map result) { StringBuilder sb = new StringBuilder(); Iterator i = result.entrySet().iterator(); if (!i.hasNext()) { return "{}"; } sb.append('{'); for (;;) { Entry e = i.next(); Object key = e.getKey(); Object value = e.getValue(); // 注意: 修改为getResultString(e)进行递归处理 sb.append(key == this ? "(this Map)" : getResultString(key)); sb.append('='); // 注意: 修改为getResultString(e)进行递归处理 sb.append(value == this ? "(this Map)" : getResultString(value)); if (!i.hasNext()) { return sb.append('}').toString(); } sb.append(", "); } }
/**
- 取得list的string,自定义的主要目的:针对value中数组数据的toString处理, copy from {@link AbstractCollection}
- @param result
- @return */ private String getListResultString(List result) { StringBuilder sb = new StringBuilder(); Iterator i = result.iterator(); if (!i.hasNext()) { return "[]"; } sb.append('['); for (;;) { Object e = i.next(); // 注意: 修改为getResultString(e)进行递归处理 sb.append(e == this ? "(this Collection)" : getResultString(e)); if (!i.hasNext()) { return sb.append(']').toString(); } sb.append(", "); } }
/**
- 取得array的string,自定义的主要目的:针对value中数组数据的toString处理
- @param result
- @return */ private String getArrayResultString(Object[] result) { return getListResultString(Arrays.asList(result)); }
/**
- 取得参数字符串
- @param args
- @return */ private StringBuffer getArgsString(Object[] args) { StringBuffer buffer = new StringBuffer(); String prefix = "args "; for (int i = 0; i < args.length; i++) { if (args.length > 1) { buffer.append(prefix + (i + 1)); } buffer.append("\r\t"); buffer.append(getResultString(args[i])); buffer.append("\n"); } return buffer; }
}
[/code]输出结果效果:
[code="java"]
[Class:PipelineArbitrateEvent , Method:init , time:2011-12-01 10:45:38.038 , take:15ms]
args 1 [20,46]
args 2 46Result TRUE
[/code]
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 -