在 Android 开发或是其他任何程序开发中,日志对我们来说是一个非常重要的工具,伴随我们整个开发过程的利器,它可以帮助我们调试代码,了解程序逻辑,以更好的定位问题。

虽然 Android 中自带的日志工具功能已经能够满足我们的开发需要,但是作为客户端,用于调试的日志信息在项目正式上线后仍然会照常打印,不仅会降低程序的运行效率,而且还有可能将一些机密性的数据泄漏出去。

难道要一行一行地把所有打印日志的代码删除或者注释掉?显然这不是什么好点子,不仅费时费力,而且以后继续维护这个项目的时候可能还会需要这些日志。

因此最理想的情况是能够自由地控制日志的打印,当程序处于开发阶段时就让日志打印出来,当程序上线了之后就把日志屏蔽掉。

看起来好像是挺高级的功能,其实并不复杂,只需要对系统提供的日志工具做简单的封装即可。

public class LogUtil {
    private static final int VERBOSE = 1;
    private static final int DEBUG = 2;
    private static final int INFO = 3;
    private static final int WARN = 4;
    private static final int ERROR = 5;
    private static final int NOTHING = 6;

    private static final String TAG = "TAG_NAME";

    private static int level = VERBOSE;

    public static void v(String msg) {
        v(TAG, msg);
    }

    public static void v(String tag, String msg) {
        if (level <= VERBOSE) {
            Log.v(tag, msg);
        }
    }

    public static void d(String msg) {
        d(TAG, msg);
    }

    public static void d(String tag, String msg) {
        if (level <= DEBUG) {
            Log.d(tag, msg);
        }
    }

    public static void i(String msg) {
        i(TAG, msg);
    }

    public static void i(String tag, String msg) {
        if (level <= INFO) {
            Log.i(tag, msg);
        }
    }

    public static void w(String msg) {
        w(TAG, msg);
    }

    public static void w(String tag, String msg) {
        if (level <= WARN) {
            Log.w(tag, msg);
        }
    }

    public static void e(String msg) {
        e(TAG, msg);
    }

    public static void e(String tag, String msg) {
        if (level <= ERROR) {
            Log.e(tag, msg);
        }
    }
}

可以看到,在 LogUtil 中先是定义了 VERBOSEDEBUGINFOWARNERRORNOTHING 这 6 个整型常量,并且它们对应的值都是递增的。然后又定义了一个静态变量 level,可以将它的值指定为上面 6 个常量中的任意一个。

接下来提供 5 个自定义的日志方法,在其内部分别调用原生的日志工具来打印日志,只不过在这些自定义的方法中都加入来一个判断,只有当 level 的值小于或等于对应日志级别值的时候,才会将日志打印出来。

同时,还对这 5 个自定义的日志方法做了方法重载,参数省略了 TAG,并用一个统一的 TAG 来代替,这样在调用的时候,就可以避免重复输入 TAG 的麻烦。

在使用该日志工具时我们只需修改 level 变量的值,就可以自由地控制日志的打印行为,比如让 level 等于 WARN 就可以只打印警告以上级别的日志,让 level 等于 NOTHING 就可以把所有日志都屏蔽掉。

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