在 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
中先是定义了 VERBOSE
、DEBUG
、INFO
、WARN
、ERROR
、NOTHING
这 6 个整型常量,并且它们对应的值都是递增的。然后又定义了一个静态变量 level
,可以将它的值指定为上面 6 个常量中的任意一个。
接下来提供 5 个自定义的日志方法,在其内部分别调用原生的日志工具来打印日志,只不过在这些自定义的方法中都加入来一个判断,只有当 level
的值小于或等于对应日志级别值的时候,才会将日志打印出来。
同时,还对这 5 个自定义的日志方法做了方法重载,参数省略了 TAG
,并用一个统一的 TAG
来代替,这样在调用的时候,就可以避免重复输入 TAG
的麻烦。
在使用该日志工具时我们只需修改 level
变量的值,就可以自由地控制日志的打印行为,比如让 level
等于 WARN
就可以只打印警告以上级别的日志,让 level
等于 NOTHING
就可以把所有日志都屏蔽掉。
使用这种方法之后,刚才所说的那个问题就不复存在了。只需要在开发阶段将 level
指定成 VERBOSE
,当项目正式上线的时候将 level
指定成 NOTHING
即可。