博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发时经经常使用的LogUtil
阅读量:6811 次
发布时间:2019-06-26

本文共 3224 字,大约阅读时间需要 10 分钟。

在开发过程中经经常使用到Log。我们常写的一种方式就是自己定义一个LogUtil工具类

private static boolean LOGV = true;    private static boolean LOGD = true;    private static boolean LOGI = true;    private static boolean LOGW = true;    private static boolean LOGE = true;    public static void v(String tag, String mess) {        if (LOGV) { Log.v(tag, mess); }    }    public static void d(String tag, String mess) {        if (LOGD) { Log.d(tag, mess); }    }    public static void i(String tag, String mess) {        if (LOGI) { Log.i(tag, mess); }    }    public static void w(String tag, String mess) {        if (LOGW) { Log.w(tag, mess); }    }    public static void e(String tag, String mess) {        if (LOGE) { Log.e(tag, mess); }    }

这种工具类能够将log分类,在公布应用时选择性关闭log。比較方便。

但问题是,跟直接使用Log相似,须要定义一个TAG,经常使用的办法是在每一个须要打log的类定义一个静态字符串常量TAG,赋值为类名。

假设。在重构时忘记改动TAG,这样在查看log时就可能会迷糊。

当然,也有非常多人会图方便。直接用System.out.println(str);输出。

前两天看VolleyLog时,学习到一种新的方法。

private static String getTag() {        StackTraceElement[] trace = new Throwable().fillInStackTrace()                .getStackTrace();        String callingClass = "";        for (int i = 2; i < trace.length; i++) {            Class
clazz = trace[i].getClass(); if (!clazz.equals(LogUtil.class)) { callingClass = trace[i].getClassName(); callingClass = callingClass.substring(callingClass .lastIndexOf('.') + 1); break; } } return callingClass; }

这种方法能够直接获取到调用者的类名。

使用例如以下:

public static void v(String mess) {        if (LOGV) { Log.v(getTag(), mess); }    }    public static void d(String mess) {        if (LOGD) { Log.d(getTag(), mess); }    }    public static void i(String mess) {        if (LOGI) { Log.i(getTag(), mess); }    }    public static void w(String mess) {        if (LOGW) { Log.w(getTag(), mess); }    }    public static void e(String mess) {        if (LOGE) { Log.e(getTag(), mess); }    }

如此就不须要再在类中定义TAG了。

在调试程序时,我们会经常打印一些信息,包含方法名/行号之类的。以下一个方法就能够省去这些麻烦:

private static String buildMessage(String msg) {        StackTraceElement[] trace = new Throwable().fillInStackTrace()                .getStackTrace();        String caller = "";        for (int i = 2; i < trace.length; i++) {            Class

> clazz = trace[i].getClass(); if (!clazz.equals(LogUtil.class)) { caller = trace[i].getMethodName(); break; } } return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread() .getId(), caller, msg); }

用法例如以下:

public static void v(String mess) {        if (LOGV) { Log.v(getTag(), buildMessage(mess)); }    }    public static void d(String mess) {        if (LOGD) { Log.d(getTag(), buildMessage(mess)); }    }    public static void i(String mess) {        if (LOGI) { Log.i(getTag(), buildMessage(mess)); }    }    public static void w(String mess) {        if (LOGW) { Log.w(getTag(), buildMessage(mess)); }    }    public static void e(String mess) {        if (LOGE) { Log.e(getTag(), buildMessage(mess)); }    }

这样每次打印log的时候就非常方便了,直接键入:LogUtil.v(msg);

不须要管TAG,方法名。还有线程ID等等信息

再一步优化就是格式化msg的内容

buildMessage(String format, Object... args)

最后说明一下。假设大量log这样打会影响程序的性能。所以这种方法仅仅是方便在调试时使用,在公布时,能够把调试的log关闭掉。

转载于:https://www.cnblogs.com/yutingliuyl/p/7110497.html

你可能感兴趣的文章
抢红包的红包生成算法
查看>>
1 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之DRBD的搭建
查看>>
升级到 PHP-7 遇到的坑 及 经验分享
查看>>
Android 关于ListView中adapter调用notifyDataSetChanged无效的原因
查看>>
redis哨兵配置
查看>>
VC++/MFC 最常用宏和指令
查看>>
外国javascript资源搜索
查看>>
DataTable中数据针对某列数据去重
查看>>
ASP.NET MVC防范CSRF最佳实践
查看>>
[LintCode] Max Points on a Line 共线点个数
查看>>
GIt的基本知识
查看>>
分享一款CSS框架
查看>>
SQL注入原理讲解,很不错!
查看>>
js-ES6学习笔记-变量的解构赋值
查看>>
Swing(Java)--维基百科
查看>>
中间人攻击——ARP欺骗的原理、实战及防御
查看>>
webpack入门
查看>>
shell实现除法,保留小数点后N位
查看>>
查看和改动MySQL数据库表存储引擎
查看>>
服务器路由配置--Route
查看>>