Logcat

今天是我过得非常不爽的一天,因为今天说了『我不会』『我不懂』『我看不明白』,从哥2017年自学安卓到现在,从一点不会到基本不百度,我还没说过这些话。今天真是太刺激了,从上层转底层真的这么费劲吗,还是说年纪大了学不动了?都不是,是我一开始学系统底层还没找到要领,同时又事物缠身,分身无术。仔细想想还是先从常用工具入手,别他妈让我抓个log都这么费劲。

logcat是什么

就是Android-sdk提供的抓取log的工具,位于Android/sdk/platform-tools/adb.

logcat启动方式

adb方式

1
adb logcat

shell方式

1
2
adb shell
logcat

logcat帮助

1
adb logcat --help

缓冲区

bufferdescription
radio无线装置/电话短信
events二进制系统事件
main主日志缓冲区,不包含系统和崩溃
system系统
crash崩溃
all所有
default默认,包含main、system、crash

命令格式

1
logcat [options] [filterspecs]

注意,这里的options可以有多个。

选项

optiondescription
-b加载可供查看的日志缓冲区
-g输出日志缓冲区信息
-c清楚所选的缓冲区并退出,默认缓冲区集合为main、system、crash,清楚所有缓冲区则使用-b all -c
-e <expr>抓取正则表达式匹配的行
-m <count>输出<count>行后退出,可与-e配合使用
-d将缓冲区的log转存到屏幕后退出
-f <filePath>将日志写入文件,默认文件名为stdout,像不像std::cout
-s过滤,一会详细了解一下
-v <format>设置日志的输出格式,默认为threadtime
-D输出日志时给各个缓冲区之间加个分割线来区分,推荐使用
-t <count>仅输出最新的行数,包含-d
-t <time>输出指定时间锚点以来的最新行,包含-d,如:adb logcat -t ‘01-26 20:52:41.820’
-T与-t一致,不包含-d
-L在最后一次重启之前转存log
-B以二进制文件输出日志
-S输出统计信息
-G设置日志缓冲区大小,单位是K或M
–pid=<pid>仅输出指定pid的log

过滤

优先级与TAG

以下是log的优先级,与AS中对应:

prioritydescription
V详细
D调试
I信息
W警告
E错误
F严重错误
S静默,毛没有

TAG不用解释了,我懂得。

格式:

1
<priority>/<tag>

eg:

1
adb logcat ActivityManager:I MyApp:D *:S

显示tag为ActivityManager并且等级是I以上的日志;和tag为MyApp并且等级为D以上的日志;与此同时,通过*:S让其他日志静默。

注意这里,实测用tag过滤后,并不能阻止其他日志的出现,所以后面必须加*:S才能单独显示tag标记后的日志。

格式控制

可以通过-v参数控制日志输出的格式。

formatdescription
briefpriority+tag+PID
long元数据字段,并使用空白行区分
processPID
raw不包含其他元数据的原始日志消息
tagpriority+tag
threadpriority+PID+TID
threadtime默认,time+priority+tag+PID+TID
timedate+time+priority+tag+PID

logcat导出

1
adb logcat -d >wzj.txt