zoukankan      html  css  js  c++  java
  • Android开发时经经常使用的LogUtil

    在开发过程中经经常使用到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关闭掉。

  • 相关阅读:
    【尺取法】
    [USACO12MAR]花盆Flowerpot [单调队列]
    数据库笔记
    NYOJ 91 阶乘之和(贪心)
    NYOJ 71 独木舟上的旅行(贪心)
    水池数目(DFS)
    poj 1164城堡问题(DFS)
    NYOJ 12 喷水装置(二)( 贪心)
    NYOJ 6(贪心)
    NYOJ 45( 分治,大数)
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7110497.html
Copyright © 2011-2022 走看看