赞
踩
Logcat是Android日常开发过程中的重要组成部分。Logcat上会显示系统消息、使用Log类添加到应用的消息、应用运行异常信息等,通过日志,我们可以实时监控应用运行状态,为应用调试提供重要参考。
一条标准的日志由以下几个部分组成:
格式:
date time PID-TID/package priority/tag: message
例子:
2022-05-15 21:55:00.461 1224-4993/com.google.android.gms W/GCM: GCM FAILED TO INITIALIZE - missing checkin
V:详细(优先级最低)
D:调试
I:信息
W:警告
E:错误
A:断言
android.util.Log是Android上用于发送日志输出的API。 Log类按照日志优先级,提供了以下最常用的5种方法:
该方法用于打印最为琐碎的、意义最小的日志信息,是Android日志级别最低的一种,其对应级别为:verbose。
该方法用于打印调试信息,可以在Release版本中关闭,比较常见,开发中经常选择输出此种级别的日志,有时在beta版应用中出现。对应级别为:debug。
该方法用于打印一些比较重要的数据,对应级别:info。该等级日志显示运行状态信息,可在产品出现问题时提供帮助,从该级别开始的日志通常包含完整意义的英语语句和调试信息,是最常见的日志级别。
该方法用于打印一些警告信息,表示运行出现异常即将发生错误或表明已发生非致命性错误,对应级别:warn。该级别日志通常显示出执行过程中的意外情况,例如将try-catch语句块中的异常打印堆栈轨迹之后可输出此种级别日志。
该方法用于打印程序中的错误信息,表示已经出现可影响运行的错误,比如应用crash时输出的日志,对应级别:error。
注:以上5种方法均存在一个重载方法,可用于输出异常信息及其堆栈轨迹。
static int v (String tag, String msg, Throwable tr);
static int d (String tag, String msg, Throwable tr);
static int i (String tag, String msg, Throwable tr);
static int w (String tag, String msg, Throwable tr);
static int e (String tag, String msg, Throwable tr);
该方法可从Throwable获取到异常信息及其堆栈轨迹。
该方法用于检查指定标签的日志是否能够在指定优先级进行输出。在Android系统上,任何标签的允许输出的默认优先级都是INFO,我们可以通过设置系统prop来控制指定标签允许输出的优先级,来控制isLoggable方法的返回结果,则我们可以通过该方法来控制指定日志的开关。
该方法用于报告一个永远不会发生的情况,“wtf"意为"what a terrible failure”,该错误将被记录在assert(中断)级别的log打印中,并可以根据系统配置发送错误报告,并立即终止程序。
adb全称Android Debug Bridge,中文翻译安卓调试桥。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备。它的主要功能有:
通过ADB命令,我们可以获取到Android设备上生成的日志信息,主要有以下几个命令:
查看手机系统当前状态信息(包含系统构建版本、网络相关、内存的使用、cpu的使用、进程等信息),需要root权限。
输出过去系统的状态,log,会打印出dmesg,dumpstate和dumpsys的输出。
打印内核kernel的信息及日志,需要root权限。
获取并打印获取系统各项服务信息,可以在命令后面加指定的service name(比如activity,location),如果不加则默认打印出设备中所有service的信息。
输出当前缓冲区日志。
注:android系统把log输出到不一样的缓冲区中,目前定义了四个log缓冲区:
- radio:输出通讯系统(无线/电话相关)的log。
- system:输出系统组件的log。
- events:输出事件相关模块的log。
- main:全部java层的log, 也是主缓冲区 (默认缓冲区)。
缓冲区主要给系统组件使用,上层应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的状况下)是输出System和Main缓冲区的log。
以下重点说明adb logcat命令:
adb logcat [选项] [过滤项]
注:[]中的内容表示是可选的,所以选项和过滤项是可选的。
参数 | 描述 |
---|---|
-b <buffer> | 加载一个可使用的日志缓冲区供查看,比如event和radio。默认值是main |
-g | 打印日志缓冲区的大小并退出 |
-c | 清除缓冲区中的全部日志并退出(清除完后可以使用-g查看缓冲区) |
-d | 将缓冲区的log转存到屏幕中然后退出, 不阻塞 |
-t <count> | 输出最近的count行日志, 输出完退出, 不阻塞 |
-B | 以二进制形式输出日志内容 |
-s | 设置输出日志的标签, 只显示该标签的日志 |
-f <filename> | 将log输出到指定的文件中,默认为标准输出(stdout) |
-r <kbytes> | 按照每千字节输出日志,默认值是16,需要和-f选项一起使用 |
-n <count> | 设置日志输出的最大数目,默认值是4,需要和-r选项一起使用 |
-v <format> | 设置日志的输出格式,注意只能设置一项 |
关于 adb logcat选项中-r -n -f的使用说明
adb logcat -f /mnt/sdcard/log/test.log -r 20 -n 6
以上述命令进行举例说明:
关于 -v <format> 的使用说明
以下对常用的<format>格式类型进行简单说明:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
Disconnected process message: 10, size: 0
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
通过使用过滤项字段,我们可以限定打印指定标签的指定优先级及以上的日志。
过滤语法:tag:priority
其中,tag为标签,priority为优先级。
可以只使用标签,而不加优先级,则会打印指定标签所有优先级的log。
优先级使用字符标识,以下优先级从低到高排列:
- V –Verbose(最低优先级)
- D – Debug
- I – Info
- W – Warning
- E – Error
- F – Fatal
- S – Silent(最高优先级,基本无日志)
举例如下:
//打印:
//(1)标签为ActivityManager,且优先级大于等于I的日志;
//(2)标签为MyApp,且优先级大于等于D的日志;
//(3)任意标签,优先级大于等于S的日志,主要是用于屏蔽其他TAG的日志。这是由于tag:priority不会影响其他标签的日志输出,只会影响指定tag输出的日志。
//若没有加上 *:S 这一句,则会按要求输出标签为ActivityManager和MyApp的指定等级日志,以及其他标签的任意级别日志。
adb logcat ActivityManager:I MyApp:D *:S
- Show only selected application:仅显示通过应用代码生成的消息(默认选项)。Logcat 使用正在运行的应用的 PID 来过滤日志消息。
- Firebase:谷歌提供的一个分析工具。
- No Filters:不应用过滤器。无论选择哪个进程,logcat都会显示设备中的所有日志消息。
- Edit Filter Configuration:创建或修改自定义过滤器。例如,可以自定义创建一个过滤器,以同时查看两个应用中的日志消息。
注:最后打印出来的日志为经过以上所有选项过滤后的日志。
保留多个Tag的日志
通过使用正则表达式来设置保留多个Tag日志,例如目前需要打印Tag为AAA和BBB的日志,则需要勾选Log Tag后的Regex选项,然后在Tag那一栏填入 AAA|BBB 即可。
过滤特定Tag的log
例如目前需要过滤掉Tag为AAA和BBB的日志,则需要勾选Log Tag后的Regex选项,然后在Tag那一栏填入 ^(?!.*(AAA|BBB)).*$ 即可。
注:对于其他选项(Message、Package Name等)也可以进行类似上面的处理。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。