leon_zhoux 2011-12-07 09:36
浏览 274
已采纳

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

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

  • 写回答

12条回答 默认 最新

  • iteye_7245 2011-12-07 09: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 46

    Result TRUE

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等