6、Logcat 命令行基础:adb logcat 的常用参数与组合技巧
说实话,很多做 Android 开发的朋友,用了好几年 logcat,翻来覆去就只会一个 adb logcat 然后按 Ctrl+F 搜关键词。嗯,这当然也能干活,但效率嘛……就像开着法拉利去菜市场买菜,动力全浪费了。
我个人习惯是,先把 logcat 的常用参数刻进肌肉记忆里。这样遇到问题,手指敲键盘的速度能跟上脑子转的速度。今天我就带你把这些参数捋一遍,再教几个实战组合拳。
6.1 最基础的过滤:按优先级和 Tag
先看一个最常用的命令:
adb logcat -s "MyApp:*"
这个 -s 是啥意思?它相当于给 logcat 设置了一个“静默模式”——除了你指定的 Tag,其他日志一概不显示。说白了,就是帮你屏蔽掉系统乱七八糟的噪音。
格式是 Tag:优先级。优先级从低到高分别是:
| 优先级 | 含义 | 我常用的场景 |
|---|---|---|
| V | Verbose(啰嗦模式) | 调试阶段,恨不得每行代码都打一条 |
| D | Debug(调试) | 开发时默认级别 |
| I | Info(信息) | 关键流程日志,比如网络请求成功 |
| W | Warning(警告) | 不致命但值得关注的问题 |
| E | Error(错误) | 出异常了,赶紧看 |
| F | Fatal(致命) | App 要崩了 |
举个例子,我只想看 MainActivity 的 Error 日志:
adb logcat -s "MainActivity:E"
我曾经在排查一个线上崩溃时,就是靠这个命令把几万行日志瞬间压缩到几十行,一眼就找到了空指针的源头。
6.2 按进程过滤:--pid 参数
有时候你开了好几个 App,日志混在一起,光靠 Tag 过滤还是不够。这时候 --pid 就派上用场了。
先拿到进程 ID:
adb shell ps | grep com.example.myapp
然后:
adb logcat --pid=12345
这样只输出这个进程的日志。你想想看,如果同时跑着微信、支付宝、你的 App,这个命令能帮你省多少眼力。
--pid 和 -s 组合使用。比如 adb logcat --pid=12345 -s "NetworkManager:E",只关心网络模块的错误。这样过滤出来的日志,基本不用再翻第二遍。
6.3 按日志缓冲区过滤:-b 参数
Android 的日志其实分好几个缓冲区。默认你看到的是 main 缓冲区,但还有 system、events、crash 等。
我遇到过一个诡异的问题:App 日志里没有任何异常,但系统就是闪退。后来我切换到 crash 缓冲区一看,原来是底层 Native 层崩了。
adb logcat -b crash
常用的缓冲区:
main— 应用层日志,默认system— 系统服务日志events— 系统事件日志(比如屏幕旋转、按键)crash— 崩溃日志all— 所有缓冲区
你也可以同时看多个缓冲区:
adb logcat -b main -b crash
6.4 格式化输出:-v 参数
默认的日志格式是 brief,只显示优先级、Tag 和消息。但有时候我们需要更多信息,比如时间戳、线程 ID。
我最常用的是 threadtime 格式:
adb logcat -v threadtime
它会显示:日期、时间、进程 ID、线程 ID、优先级、Tag、消息。排查多线程问题时,这个格式简直是救命稻草。
其他格式:
time— 显示日期和时间long— 显示所有元数据,包括日志行号color— 根据优先级显示不同颜色(终端支持的话)
-v 参数可以和其他参数组合。比如 adb logcat -v threadtime -s "MyApp:*",既过滤 Tag,又显示完整时间线。
6.5 清空与保存:-c 和 -d
有时候日志刷得太快,我想从头开始看。这时候先清空:
adb logcat -c
然后重新操作 App,再抓日志。这样日志里只有你关心的那一段。
如果想直接把当前日志导出到文件:
adb logcat -d > log.txt
-d 的意思是“dump 当前缓冲区内容然后退出”,不会阻塞终端。我经常在自动化测试脚本里用这个,把日志保存下来供后续分析。
6.6 正则过滤:-e 参数
这个参数知道的人不多,但非常强大。-e 支持用正则表达式过滤日志消息。
adb logcat -e "java\.lang\.NullPointerException"
只显示包含空指针异常的日志行。我曾经用它来追踪一个偶现的崩溃,配合 -v threadtime 和 --pid,三分钟就定位到了问题。
. 要写成 \.,否则它会匹配任意字符。
6.7 实战组合技巧
光讲参数没意思,我直接给你几个我工作中常用的组合命令:
- 排查崩溃:
adb logcat -b crash -v threadtime -d > crash_log.txt
这个命令直接导出崩溃缓冲区的完整日志,带时间戳,适合发给同事分析。
- 实时监控特定模块:
adb logcat -s "NetworkManager:W" "DatabaseHelper:E" -v color
同时监控网络模块的警告和数据库模块的错误,并且用颜色区分优先级。嗯,看着舒服多了。
- 抓取 ANR 前后的日志:
adb logcat -b events -v threadtime | grep "am_anr"
ANR 事件会记录在 events 缓冲区。这个命令可以实时捕获 ANR 发生的时间点,然后你再切回 main 缓冲区看那个时间点附近的日志。
6.8 知识体系总览
下面这张图是我自己整理的 logcat 参数体系,你可以把它当成一个速查地图:
这张图把 logcat 的参数分成了三大类:过滤类、输出控制类、缓冲区选择。你不需要一次性记住所有参数,但至少要知道有这些工具存在。遇到具体问题时,知道该翻哪个口袋找工具。
好了,这一章的内容就到这里。参数这东西,光看是记不住的。我建议你打开终端,把今天讲的命令挨个敲一遍。敲完你会发现——原来以前都在用蛮力干活。
公众号:蓝海资料掘金营,微信deep3321