Log等级划分
Log.v("Tag","Msg");//Verbose 观察值,Verbose是冗长、啰嗦的意思,任何消息都会输出
Log.d("Tag","Msg");//Debug 调试
Log.i("Tag","Msg");//Info 信息,为一般提示性的消息
Log.w("Tag","Msg");//Warn 可能会出问题,一般用于系统提示开发者需要优化android代码等场景
Log.e("Tag","Msg");//Error 崩溃信息,一般用于输出异常和报错信息
Android Studio 中 Logcat 观察打印日志,可以筛选级别,如果选择 Verbose 可以查看所有,如果选择 Debug,Debug以上的Verbose级别不能查看,Debug和以下级别可以查看,依次类推
右侧输入框可以通过第一个参数Tag来筛选日志信息
Log使用规范
1、在app中,一般不允许使用 VERBOSE 级别的 log,对于 INFO、WARN 级别的 log,允许极少量打印重要信息。这是工作中的要求,系统源码中其实对这三个等级用得也不少,例如,系统打印一般 Exception 信息时,就是用的 WARN 级别 log
2、只有在出现极严重错误的时候,才允许使用 ERROR 级别,一般的信息要是用 DEBUG 级别(在后面讲 Log.isLoggable() 的时候,会讲到用 DEBUG 级别的好处)。当系统报 Fatal Exception 的时候,就是用的 ERROR 级别的 log
3、用户的隐私信息禁止打印,比如:IMEI、手机号、密码、银行卡号等。在国外,一些法律也对Log内容做了严格的要求
4、Log中不要打印太多具体实现的细节,这样会导致通过 log 就能猜到架构的设计和代码的实现
5、Log中不能暴露核心算法或机制细节,比如核心算法相关信息、应用和框架间函数的调用流程等
6、禁止在循环打印log。在循环条件、频繁操作、频繁调用的接口、ACTION_MOVE事件、重复打印等地方,一定要控制好 log 的使用。在单位时间内,不同性质的应用对 log 的数目有一定的要求,对每条 log 的大小也有一定的限制。因为大量或者频繁的 log,对 app 的性能有一定的影响。即便是有 log 开关控制日志的输出与否,字符串的拼接也是会耗掉一些性能和资源的
7、打印捕捉到的异常堆栈必须谨慎,如不需要打印堆栈就能定位问题,就尽量不要打印堆栈,若确实需要堆栈,在同一堆栈,尽量控制打印频度
8、对于 Android 源码中自带的 log,尽量不要修改。在Event Log中,就严禁修改源码自带的log
9、Log 中的 TAG,一般以所划分的功能模块命名,log 信息也最好用类名,方法名拼接为前缀。这样做的目的就是在查看 log 的时候,方便定位,对分析问题很有帮助
上述不仅包含使用规范,也包含了部分log使用小技巧。这些规范中有些会根据不同公司,不同严格程度而有所不同,而有些则需要统一遵守其规范的,读者可以根据具体情况斟酌。
Android Studio中log使用
Logcat中选择筛选条件
最后一项,Show only selected application
表示只显示当前选中程序的日志,也就是第二项选中的app 进程
Firebase
是Google 提供的一个开发者工具和基础架构平台,先不管
Nofilter
相当于没有过滤器,会把所有日志显示出来
Edit Filter Configuration
可以自定义过滤器,我们来试一下,点击 Edit Filter Configuration,给过滤器起名 data,让它对名为 data 的 tag 过虑
然后你会发现多了个过滤器
Log信息颜色设置
为了便于查看不同等级的 log,Android Studio 对不同等级的 log 信息设置了不同的颜色。设置路径为:File > Settings > Editor > Colors Scheme > Android Logcat。或者直接搜索 log 即可找到,如下截图所示:
我设置的色值如下
Assert #8F0005
Verbose #000000
Debug #0070BB
Info #48BB31
Warning #BBBB23
Error #FF0006
当然颜色可以自己随便设置,但是一般遵守约定俗称的规定,比如,ERROR 级别的 log,就往往被设置为红色
Log信息说明
写一份便于使用的Log辅助类
public class Logger {
//设为false关闭日志
private static final boolean LOG_ENABLE = true;
public static void i(String tag, String msg){
if (LOG_ENABLE){
Log.i(tag, msg);
}
}
public static void v(String tag, String msg){
if (LOG_ENABLE){
Log.v(tag, msg);
}
}
public static void d(String tag, String msg){
if (LOG_ENABLE){
Log.d(tag, msg);
}
}
public static void w(String tag, String msg){
if (LOG_ENABLE){
Log.w(tag, msg);
}
}
public static void e(String tag, String msg){
if (LOG_ENABLE){
Log.e(tag, msg);
}
}
}