高手们来看看 关于解决方法调用的日志的问题

现在做项目遇到个事 第一期的项目日志记录不是很详细倒致后期维护很烦人 现在开始做第二期了想把日志服务写得完善点想记录一个流程的调用轨迹和传参的值的内容 没有想出好的办法来 请高手们帮忙下 。或者是在调方法时把传入方法的形参给打印出来。如public void getUserInfo(int userId,String username); 这个方法在调用的时候我想把userId和username打印出来 不是通过在方法体里面写一个函数print(userId,username)这种方法实现 因为一个项目方法很多 要这样在方法体内写的话工作量很大 或有没有别的方法比如在方法体里面直接调一个函数print();或print(this)这类的方法实现 希望在调用print这个函数时需要传的形参是不变的。高手们来帮忙!!@!!
问题补充
星期6难道都莫有人来了啊
问题补充
不好意思 确实没描述清楚 谢谢大家

几个项目中,一直在用的记录调用请求参数,以及返回结果,时间等。

能用就凑活用吧
[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 46

Result TRUE

[/code]

用AOP可以实现你这样的需求,做到日志与业务代码分开,这样开发起来容易些

叙述真是一团凌乱,不知道要表达啥

如果要统一加入一个方法,AOP 动态代理 都是可行的

AOP吧。lz的表达能力有待提高。

http://xiaojinge-ok-163-com.iteye.com/admin/blogs/908190 看看这篇文章,对你的问题会有帮助!

仅把参数打印,那就AOP吧!
而且Spring AOP已经先提供了这样的interceptor CustomizableTraceInterceptor
支持method class arguments 以及调用耗时和调用是否异常,
你只需要配置一下enterMessage调用方法之前的消息模板格式

这不是标准的用AOP能解决的事吗?

也可以使用模板模式,所有的行为都使用某个模板,模板对日志进行记录。

AOP 注解方式

AOP。。。

好多人 根本 不看 内容 就 回复了

[code="java"]
public class TestLog {
public static void println(Object className) {
System.out.println(className.getClass().getName());
}
public void println() {
println(this);
}
public static void main(String[] args) {
TestLog log = new TestLog();
log.println();
}
}

[/code]
不知道 楼主是不是要这样的代码