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
- Android-外功篇-MyLogger自定义Log
- Android-外功篇-Utils
- Android-外功篇-ActionBar
- Android-外功篇-单例Toast,解决重复弹出
- android自定义log
- Android LOG标签自定义
- Android 自定义Log
- Android 自定义Log
- 自定义Android Log打印
- Android LOG标签自定义
- Android LOG标签自定义
- Android 自定义打印log
- <Android>自定义Log开关
- android 自定义log打印
- Android自定义Log库
- Android---自定义Log
- android/java 自定义log日志
- android自定义LOG输出位置
- shiro问题
- iOS设备的发展史
- Identifier Case Sensitivity
- 四层和七层负载均衡的区别
- 欢迎使用CSDN-markdown编辑器
- Android-外功篇-MyLogger自定义Log
- axis2+MyEclipse8.5实现webservice接口例子(没有使用插件)
- 黑马程序员-----IO(二)
- 谈谈activiti个人理解及基础Demo环境搭建
- Spring MVC的Controller统一异常处理:HandlerExceptionResolver
- ELO等级分制度
- IIS 中站点浏览报错的解决方法
- Windows 64位下装Oracle 11g 64位,PLSQL(Database为空)
- java对象序列化