Android开发经验谈Android开发Android开发

Tips1 让日志如你所想

2018-06-01  本文已影响12人  常思行

一、现在让我们来做一个场景假设

当我们正在编写一个比较庞大的项目,期间为了方便调试,在代码的很多地方都打印了大量的日志。最后项目终于基本完成了,但是却有一个非常让人头疼的问题,那就是之前用于调试的那些日志,在项目正式上线之后仍然会照常打印,这样不仅会降低程序的运行效率,还有可能将一些机密性的数据泄露出去,这时我们该怎么办呢?

要一行一行把所有打印日志的代码都删掉吗?很显然这是不可能的,费时费力不说,万一以后我们继续维护这个项目的时候又需要这些日志怎么办呢?一行一行再加回来吗?那我们可就都得疯了。

最理想的情况莫过于能够自由地控制日志的打印,当程序处于开发阶段就让日志打印出来,当程序上线了之后就把日志屏蔽掉,要怎么做呢?

二、问题的解决

其实我们可以定制一个工具类,比如新建一个Logger 类,代码如下所示:

public class Logger {
    public static final int LOG_LEVEL = 6;  // 如果想屏蔽所有log,可以设置为0
    public static final int VERBOSE = 5;
    public static final int DEBUG = 4;
    public static final int INFO = 3;
    public static final int WARN = 2;
    public static final int ERROR = 1;

    public static void v(String tag, String msg) {
        if (LOG_LEVEL > VERBOSE) {
            Log.v(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (LOG_LEVEL > DEBUG) {
            Log.d(tag, msg);
        }
    }

    public static void i(String tag, String msg) {
        if (LOG_LEVEL > INFO) {
            Log.i(tag, msg);
        }
    }

    public static void w(String tag, String msg) {
        if (LOG_LEVEL > WARN) {
            Log.i(tag, msg);
        }
    }

    public static void e(String tag, String msg) {
        if (LOG_LEVEL > ERROR) {
            Log.e(tag, msg);
        }
    }

    public static void v(String msg) {
        if (LOG_LEVEL > VERBOSE) {
            Log.v(getCallerName(), msg);
        }
    }

    public static void d(String msg) {
        if (LOG_LEVEL > DEBUG) {
            Log.d(getCallerName(), msg);
        }
    }

    public static void i(String msg) {
        if (LOG_LEVEL > INFO) {
            Log.i(getCallerName(), msg);
        }
    }

    public static void w(String msg) {
        if (LOG_LEVEL > WARN) {
            Log.w(getCallerName(), msg);
        }
    }

    public static void e(String msg) {
        if (LOG_LEVEL > ERROR) {
            Log.e(getCallerName(), msg);
        }
    }

    /**
     * 获取调用者的类名
     * @return
     */
    public static String getCallerName() {
        StackTraceElement caller = Thread.currentThread().getStackTrace()[4];
        String className = caller.getClassName();// 带有包名信息
        className = className.substring(className.lastIndexOf(".") + 1);
        return className;
    }
}

正如我们看到的,我们在 Logger 中先是定义了VERBOSE、 DEBUG、 INFO、 WARN、 ERROR 这五个整型常量,并且它们对应的值都是递减的,然后又定义了一个 LOG_LEVEL 常量,可以将它的值指定为上面五个常量中的任意一个。

接下来我们提供了 v()、d()、i()、w()、e() 这五个自定义的日志方法,在其内部分别调用了 Log.v()、Log.d()、Log.i()、Log.w()、Log.e() 这五个方法来打印日志,只不过在这些自定义的方法中我们都加入了一个 if 判断,只有当 LEVEL 常量的值大于对应日志级别值的时候,才会将日志打印出来。

这样就把一个自定义的日志工具创建好了,之后在项目里我们可以像使用普通的日志工具一样使用 Logger,比如打印一行 DEBUG 级别的日志就可以这样写:Logger.d("TAG", "debug log"); 打印一行 WARN 级别的日志就可以这样写:Logger.w("TAG", "warn log"); 然后我们只需要修改 LOG_LEVEL 常量的值,就可以自由地控制日志的打印行为了。

使用了这种方法之后,刚才所说的那个问题就不复存在了,我们只需要在开发阶段将 LOG_LEVEL 指定成大于 VERBOSE 的值,当项目正式上线的时候将 LOG_LEVEL 指定成0就可以了。

甚至我们采用重写的方法还可以直接打印出调用者的名字,而无需每次都写入TAG参数,就是说我们呢每次只要输入我们想要打印的信息就可以了,省时省力何乐不为。

感谢优秀的你跋山涉水看到了这里,欢迎关注下让我们永远在一起!

上一篇下一篇

猜你喜欢

热点阅读