本文已参与「新人创作礼」活动,一起开启掘金创作之路
大家好,最近接到一个新的需求,要求了解一下远程调试,方便即时帮助客户解决线上问题;
开发者解决问题不都是通过debug或者logcat日志来排查问题的么,那我们可不可以收集用户手机设备上的所有logcat日志来进行问题排查呢?
那我们就了解一下如何收集到logcat日志吧!
一、在CMD窗口中查看手机的log日志
当然AndroidStudio提供的Terminal工具也可以当做cmd直接拿来使用;
确定手机通过数据线连接电脑后,可通过Terminal工具输入adb device来查看连接的设备;
在Terminal窗口中输入如下命令,就可以获得像Logcat窗口中显示的日志信息:
//格式1:打印默认日志数据
adb logcat
//格式2:需要打印日志详细时间的简单数据
adb logcat -v time
//格式3:需要打印级别为Error的信息
adb logcat *:E
//格式4:需要打印时间和级别是Error的信息
adb logcat -v time *:E
//格式5:将日志保存到电脑固定的位置,
比如D:\log.txt adb logcat -v time >D:\log.txt
这时手机日志更新什么日志,cmd窗口也会同步更新数据。
但是这样没有过滤条件,如果Log日志很多,很难找到我们想要的信息,
当然也可以复制cmd中的数据到一个文本中慢慢处理的,就是效率不高。
下面介绍adb logcat中的详细参数命令以及如何才能高效的打印日志,或者把日志保存到我们指定的位置。
二、adb logcat 指令详解
输入adb logcat -help,查看一下一些简单的数据格式:
但是,没用过adb logcat,对于上面的指令也是不知所以然的。可以先看看后面的介绍。
1.adn logcat日志格式
adb logcat [<option>] ... [<filter-spec>] ...
adb logcat [选项...] [过滤项...],
前面那些-s,-v就是选项,后面那些V、D、I、W、E、F、S是级别过滤项,同一个tag只能有一个过滤项,多个tag可以有多个过滤项。
先介绍过滤项,这个比较简单,后面在介绍选项。
2.按级别过滤日志
格式:
adb logcat <tag>[:priority]
tag表示标签,priority输出的级别
日志默认级别是V,如果错误日志我们选择E就可以。
Android 的日志分为如下几个优先级(priority):
V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不输出)
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
adb logcat *:W
其实*可以是某个tag,如果没有指明,就表示所有。
会将 Warning、Error、Fatal 和 Silent 日志输出。
(注: 在 macOS 下需要给 :W 这样以 * 作为 tag 的参数加双引号,如 adb logcat “ :W”,不然会报错 no matches found: *:W。)
3.按 tag 和级别过滤日志
可以由多个 [:priority] 组成。
比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
###但是我发现自己使用tag标签命令,并没有成功过滤。并且使用tag后,后面的级别也无效了,所以tag使用*号比较保险。
4.adb logcat选项解析
--"-s"选项 : 设置输出日志*:s的标签, 只显示该标签的日志;
--"-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
--"-r"选项 : 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
--"-n"选项 : 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
--"-v"选项 : 设置日志的输出格式, 注意只能设置一项;
--"-c"选项 : 清空所有的日志缓存信息;
--"-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;
--"-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;
--"-g"选项 : 查看日志缓冲区信息;
--"-B"选项 : 以二进制形式输出日志;
s相当于过滤*:s的日志,所以是没有日志输出的。
这里介绍下用得比较多的选项-v、-c:
(1)adb logcat -v
-v是设置日志的输出格式的
日志支持按以下几种格式 :
①brief
默认格式。格式为:
<priority>/<tag>(<pid>): <message>
示例:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
②process
格式为:
<priority>(<pid>) <message>
示例:
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)
③tag
格式为:
<priority>/<tag>: <message>
示例:
D/HeadsetStateMachine: Disconnected process message: 10, size: 0
④raw
格式为:
<message>
示例:
Disconnected process message: 10, size: 0
⑤time
格式为:
<datetime> <priority>/<tag>(<pid>): <message>
示例:
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0
⑥threadtime
格式为:
<datetime> <pid> <tid> <priority> <tag>: <message>
示例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0
⑦long
格式为:
[ <datetime> <pid>:<tid> <priority>/<tag> ]
⑧ 示例:
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0
⑨指定格式可与上面的过滤同时使用。比如:
adb logcat -v long ActivityManager:I *:S
对于-v选项: 如果需要的是普通日志那么使用-v time就可以了, 如果需要查看线程区别使用 -v threadtime就可以了,其他日志基本也是少用的。
(2)adb logcat -c
清除之前的日志信息,一般在看日志前都会执行这个命令,目的是好看日志,不然前面的日志应该会超级多,不好看问题。
直接显示日志信息,是会显示很多日志信息的,好像是从设备最近一次开机的日志开始显示,
最好的做法的先使用-c清除之前的日志信息,再触发事件,查看最近的日志信息。
三、把日志信息保存到电脑中
adb logcat最后添加” > 保存文件的地址 “
比如需要将的信息保存到电脑中使用下面的命令:
adb logcat -v time > D:\log.txt
你就可以在D盘中看到一个log.txt文件,并且里面有之前的日志信息
如果没有指定具体的位置的命令
adb logcat -v time > log.txt
这个文件是保存在C盘的用户名的文件夹下的。