Android-外功篇-MyLogger自定义Log

来源:互联网 发布:永恒之柱 mac汉化 编辑:程序博客网 时间:2024/05/09 14:19

1.原始版

public class MyLogger {    private final String TAG = "你的应用程序名";//使用时换做自己的application名    //private boolean isDebug = android.os.Build.TYPE.startsWith("user") ? Log.isLoggable(TAG, Log.DEBUG) : true;    private boolean isDebug = true;    private String mClassName;    public MyLogger(String name) {        mClassName = name;    }    public void v(String log) {        if (isDebug) {            Log.v(TAG, "[" + mClassName + "]:" + log);        }    }    public void d(String log) {        if (isDebug) {            Log.d(TAG, "[" + mClassName + "]:" + log);        }    }    public void i(String log) {        if (isDebug) {            Log.i(TAG, "[" + mClassName + "]:" + log);        }    }    public void i(String log, Throwable tr) {        if (isDebug) {            Log.i(TAG, "[" + mClassName + "]:" + log + "\n"                    + Log.getStackTraceString(tr));        }    }    public void w(String log) {        if (isDebug) {            Log.w(TAG, "[" + mClassName + "]:" + log);        }    }    public void w(String log, Throwable tr) {        if (isDebug) {            Log.w(TAG, "[" + mClassName + "]:" + log + "\n"                    + Log.getStackTraceString(tr));        }    }    public void e(String log) {        if (isDebug) {            Log.e(TAG, "[" + mClassName + "]:" + log);        }    }    public void e(String log, Throwable tr) {        if (isDebug) {            Log.e(TAG, "[" + mClassName + "]:" + log + "\n"                    + Log.getStackTraceString(tr));        }    }}

使用方法:
|作为每个类的成员变量,实例化是传入该类的类名,如:MainActivity
public final MyLogger LOG = new MyLogger(“MainActivity”);
LOG.i(“onCreate”);直接在需要处使用即可。
|release时将isDebug的值改为false,就可以不再打印log。

2.改进版

public class MyLogger {    private final String TAG = "你的应用程序名";//使用时换做自己的application名    //private boolean isDebug = android.os.Build.TYPE.startsWith("user") ? Log.isLoggable(TAG, Log.DEBUG) : true;    private boolean isDebug = true;    private String mClassName;    public int curLogLevel = Log.VERBOSE;//当前需要打印的log等级    public MyLogger(String name) {        mClassName = name;    }    public void v(String log) {        if (curLogLevel > Log.VERBOSE) {              return;          }         if (isDebug) {            Log.v(TAG, "[" + mClassName + "]:" + log);        }    }    public void d(String log) {        if (curLogLevel > Log.DEBUG) {              return;          }         if (isDebug) {            Log.d(TAG, "[" + mClassName + "]:" + log);        }    }    public void i(String log) {        if (curLogLevel > Log.INFO) {              return;          }         if (isDebug) {            Log.i(TAG, "[" + mClassName + "]:" + log);        }    }    public void i(String log, Throwable tr) {        if (curLogLevel > Log.INFO) {              return;          }         if (isDebug) {            Log.i(TAG, "[" + mClassName + "]:" + log + "\n"                    + Log.getStackTraceString(tr));        }    }    public void w(String log) {        if (curLogLevel > Log.WARN) {              return;          }         if (isDebug) {            Log.w(TAG, "[" + mClassName + "]:" + log);        }    }    public void w(String log, Throwable tr) {        if (curLogLevel > Log.WARN) {              return;          }         if (isDebug) {            Log.w(TAG, "[" + mClassName + "]:" + log + "\n"                    + Log.getStackTraceString(tr));        }    }    public void e(String log) {        if (curLogLevel > Log.ERROR) {              return;          }         if (isDebug) {            Log.e(TAG, "[" + mClassName + "]:" + log);        }    }    public void e(String log, Throwable tr) {        if (curLogLevel > Log.ERROR) {              return;          }         if (isDebug) {            Log.e(TAG, "[" + mClassName + "]:" + log + "\n"                    + Log.getStackTraceString(tr));        }    }}

用法一样,只是增加了打印等级控制curLogLevel

3.网上抄袭版

原文出自:http://blog.csdn.net/iplayvs2008/article/details/40422999

public class LogUtils {      private static StackTraceElement[] currentThread;      private static String tagName;      private static String msgT;      private static String msgC;      private static String callTraceStack;      private static int curLogLevel = Log.VERBOSE;      public static int getCurLogLevel() {          return curLogLevel;      }      public static void setCurLogLevel(int curLogLevel) {          LogUtils.curLogLevel = curLogLevel;      }      public synchronized static void initTrace(String msg, int... isPrintStack) {          int isPrintStackOne = isPrintStack.length > 0 ? isPrintStack[0] : 10;          currentThread = Thread.currentThread().getStackTrace();          // vm调用栈中此方法所在index:2:VMStack.java:-2:getThreadStackTrace()<--Thread.java:737:getStackTrace()<--          int curentIndex = 4;          String className = currentThread[curentIndex].getFileName();          int endIndex = className.lastIndexOf(".");          tagName = endIndex < 0 ? className : className.substring(0, endIndex);          msgT = "[" + className + ":" + currentThread[curentIndex].getLineNumber() + ":"                  + currentThread[curentIndex].getMethodName() + "()]---";          msgC = "msg:[" + msg + "]";          if (isPrintStackOne > 0) {              StringBuilder sb = new StringBuilder();              sb.append("callTraceStack:[");              for (int i = curentIndex; i < curentIndex + isPrintStackOne && i < currentThread.length; i++) {                  sb.append(currentThread[i].getFileName() + ":" + currentThread[i].getLineNumber() + ":"                          + currentThread[i].getMethodName() + "()" + "<--");              }              sb.append("]");              callTraceStack = sb.toString();              msgC += callTraceStack;          }      }      public static void e(String msg, boolean printStack) {          e(msg, printStack ? 105 : 0);      }      public static void w(String msg, boolean printStackNum) {          w(msg, printStackNum ? 105 : 0);      }      public static void d(String msg, boolean printStackNum) {          d(msg, printStackNum ? 105 : 0);      }      public static void v(String msg, boolean printStackNum) {          v(msg, printStackNum ? 105 : 0);      }      public static void i(String msg, boolean printStackNum) {          i(msg, printStackNum ? 105 : 0);      }      public static void e(String msg, int... printStackNum) {          if (curLogLevel > Log.ERROR) {              return;          }          initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);          Log.e(tagName, msgT + msgC);      }      public static void w(String msg, int... printStackNum) {          if (curLogLevel > Log.WARN) {              return;          }          initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);          Log.w(tagName, msgT + msgC);      }      public static void d(String msg, int... printStackNum) {          if (curLogLevel > Log.DEBUG) {              return;          }          initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);          Log.d(tagName, msgT + msgC);      }      public static void v(String msg, int... printStackNum) {          if (curLogLevel > Log.VERBOSE) {              return;          }          initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);          Log.v(tagName, msgT + msgC);      }      public static void i(String msg, int... printStackNum) {          if (curLogLevel > Log.INFO) {              return;          }          initTrace(msg, printStackNum.length > 0 ? printStackNum[0] : 0);          Log.i(tagName, msgT + msgC);      }  } 

说明:
1. 使用方式:LogUtil.v(“~test~”);
2.
public static void v(String msg, int… printStackNum)中printStackNum为可选参数,表示打印多少层调用栈
3.
curLogLevel表示当前打印日志的最低等级,比如设置为Log.INFO,则info以上的打印,以下的不打印,这样在Debug阶段,设置为
Log.VERBOSE,在Release阶段设置为Log.ERROR或者Log.ASSERT,就可以不打印哪些调试日志
4. 这样使用Thread.currentThread().getStackTrace(),效率可能比较低,调试可以用,发行版本,最好关闭日志如果有大神有优化方案,不吝指点一二。

总结:
|-第二种一直在用,只是麻烦在每次使用需要在各个类中实例化,传入各自的类名。
|-第三种比较方便,但是可能性能稍差吧。

0 0
原创粉丝点击