A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心弦上的景致 中级黑马   /  2015-8-25 17:50  /  180 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 心弦上的景致 于 2015-8-25 18:31 编辑

    所有的软件,大体可肢解为两部分:样式和数据。样式:交互入口。数据:业务(排除指令数据)。数据有区分为业务数据和逻辑数据。数据流通,依赖协议;数据容 储,又分为记忆和非记忆,主要依赖数据库和其他数据容储办法。项目出问题,90%的问题都是数据导致的。所以,我认为,大部分测试手段,都是基于对数据的 检验而衍生出来的解决办法。在数据操作过程中,我总结了这样几个行为:生产,消费,建模,交互,分流,包装。如何保证数据不发生偏误和丢失,如何提高解决 问题的效率,这就成了一个有意思的话题。在以往的项目实施过程中吗,我养成了这样一个方式。第一,注释保持有效代码量的1/3;第二,所有基于数据,进行日志输出。
    涉及到项目里面所有的业务数据和逻辑数据,全部进行输出。在这方面,不必担心数据泄漏问题,也不需要通过逻辑数据控制日志输出。
    如何控制日志是否输出。通过BuildConfi.java里面boolean字段进行控制。该文件与R文件在同一个目录下。debug签名情况下,状态为true,签名之
后,自动切换为了false,通过它控制日志输出,不做认为设置,避免疏漏导致数据泄漏。
   如下是自定义log的具体代码,一共分两个文件:
  1. public class Logger {

  2.     public Logger() { }

  3.     public void v(String format, Object... args)  { }

  4.     public void d(String format, Object... args)  { }

  5.     public void i(String format, Object... args)  { }

  6.     public void w(String format, Object... args)  { }

  7.     public void w(Throwable tr, String format, Object... args)  { }

  8.     public void e(String format, Object... args)  { }

  9.     public void e(Throwable tr, String format, Object... args)  { }

  10.     public void wtf(String format, Object... args)  { }

  11.     public void wtf(Throwable tr, String format, Object... args)  { }

  12. public class LogManager {
  13.    
  14.     public static final String Default_Tag = "LOGTEST";
  15.    
  16.     private static Logger Logger;
  17.    
  18.     private static HashMap<String,Logger> LoggerMap = null;
  19.    
  20.     public static Logger getLogger() {
  21.         return getLogger(null);
  22.     }
  23.    
  24.     public static Logger getLogger(String tag) {
  25.         if(BuildConfig.DEBUG) {
  26.             return getDebugLogger(tag);            
  27.         } else {
  28.             if (Logger == null) {
  29.                 Logger = new Logger();
  30.             }
  31.             return Logger;
  32.         }
  33.     }
  34.    
  35.     private static Logger getDebugLogger(String tag) {
  36.         if(null == tag) tag = Default_Tag;
  37.         
  38.         Logger logger;
  39.         if(null == LoggerMap) {
  40.             synchronized (LogManager.class) {
  41.                 if(null == LoggerMap) LoggerMap = new HashMap<String,Logger>();   
  42.             }
  43.         }

  44.         if (LoggerMap.containsKey(tag))
  45.             logger = LoggerMap.get(tag);
  46.         else {
  47.             logger = new DebugLogger(tag);
  48.             LoggerMap.put(tag, logger);
  49.         }
  50.         return logger;
  51.     }

  52.     private static class DebugLogger extends Logger {
  53.         private String tag;
  54.         
  55.         private DebugLogger(String tag) {   
  56.             if(null != this.tag && tag == this.tag) return;        
  57.             this.tag = null == tag? LogManager.Default_Tag:tag;
  58.         }
  59.         
  60.         @Override
  61.         public void v(String format, Object... args) {
  62.             Log.v(tag, buildSimpleMessage(format, args));
  63.         }

  64.         @Override
  65.         public void d(String format, Object... args) {
  66.             Log.d(tag, buildSimpleMessage(format, args));
  67.         }
  68.         
  69.         @Override
  70.         public void i(String format, Object... args) {
  71.             Log.i(tag, buildSimpleMessage(format, args));
  72.         }
  73.         
  74.         @Override
  75.         public void w(String format, Object... args) {
  76.             Log.w(tag, buildMessage(format, args));
  77.         }
  78.         
  79.         @Override
  80.         public void w(Throwable tr, String format, Object... args) {
  81.             Log.w(tag, buildMessage(format, args), tr);
  82.         }

  83.         @Override
  84.         public void e(String format, Object... args) {
  85.             Log.e(tag, buildMessage(format, args));
  86.         }

  87.         @Override
  88.         public void e(Throwable tr, String format, Object... args) {
  89.             Log.e(tag, buildMessage(format, args), tr);
  90.         }

  91.         @Override
  92.         public void wtf(String format, Object... args) {
  93.             Log.wtf(tag, buildMessage(format, args));
  94.         }

  95.         @Override
  96.         public void wtf(Throwable tr, String format, Object... args) {
  97.             Log.wtf(tag, buildMessage(format, args), tr);
  98.         }

  99.         private String buildSimpleMessage(String format, Object... args) {
  100.             return (args == null) ? format : String.format(Locale.US, format, args);
  101.         }
  102.         private String buildMessage(String format, Object... args) {
  103.             String msg = buildSimpleMessage(format, args);
  104.             StackTraceElement[] trace = new Throwable().fillInStackTrace().getStackTrace();

  105.             String caller = "<unknown>";
  106.             for (int i = 2; i < trace.length; i++) {
  107.                 Class<?> clazz = trace[i].getClass();
  108.                 if (!clazz.equals(DebugLogger.class)) {
  109.                     String callingClass = trace[i].getClassName();
  110.                     callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
  111.                     callingClass = callingClass.substring(callingClass.lastIndexOf('.') + 1);
  112.                     caller = callingClass + "." + trace[i].getMethodName();
  113.                     break;
  114.                 }
  115.             }
  116.             return String.format(Locale.US, "[%d] %s: %s",
  117.                     Thread.currentThread().getId(), caller, msg);
  118.         }
  119.     }
  120. }

复制代码
       使用方式:LogManager.getLogger().d("keyvalues: %s, keyvalues: %s",values, values);
    %s 设置以字符串格式输出,keyvalues自定数据串标识,values表示和keyvalues对应的实体数据
    这个Log工具,能够定位输出数据所在的文件名字和方法名字。通过LogManager的Default_Tag设置Tag信息,通过自定义过滤器进行针对性过滤,这样呈现的就是你当前交互过程中,所有生产和消费数据的情况。大部分问题,通过观察数据输出,直接能够定位到数据断层,找到问题根源,个别情况需要通过debug进行辅助。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马