6、Logcat 命令行基础:adb logcat 的常用参数与组合技巧

说实话,很多做 Android 开发的朋友,用了好几年 logcat,翻来覆去就只会一个 adb logcat 然后按 Ctrl+F 搜关键词。嗯,这当然也能干活,但效率嘛……就像开着法拉利去菜市场买菜,动力全浪费了。

我个人习惯是,先把 logcat 的常用参数刻进肌肉记忆里。这样遇到问题,手指敲键盘的速度能跟上脑子转的速度。今天我就带你把这些参数捋一遍,再教几个实战组合拳。

6.1 最基础的过滤:按优先级和 Tag

先看一个最常用的命令:

adb logcat -s "MyApp:*"

这个 -s 是啥意思?它相当于给 logcat 设置了一个“静默模式”——除了你指定的 Tag,其他日志一概不显示。说白了,就是帮你屏蔽掉系统乱七八糟的噪音。

格式是 Tag:优先级。优先级从低到高分别是:

优先级含义我常用的场景
VVerbose(啰嗦模式)调试阶段,恨不得每行代码都打一条
DDebug(调试)开发时默认级别
IInfo(信息)关键流程日志,比如网络请求成功
WWarning(警告)不致命但值得关注的问题
EError(错误)出异常了,赶紧看
FFatal(致命)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 缓冲区,但还有 systemeventscrash 等。

我遇到过一个诡异的问题: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 实战组合技巧

光讲参数没意思,我直接给你几个我工作中常用的组合命令:

  1. 排查崩溃:
adb logcat -b crash -v threadtime -d > crash_log.txt

这个命令直接导出崩溃缓冲区的完整日志,带时间戳,适合发给同事分析。

  1. 实时监控特定模块:
adb logcat -s "NetworkManager:W" "DatabaseHelper:E" -v color

同时监控网络模块的警告和数据库模块的错误,并且用颜色区分优先级。嗯,看着舒服多了。

  1. 抓取 ANR 前后的日志:
adb logcat -b events -v threadtime | grep "am_anr"

ANR 事件会记录在 events 缓冲区。这个命令可以实时捕获 ANR 发生的时间点,然后你再切回 main 缓冲区看那个时间点附近的日志。

6.8 知识体系总览

下面这张图是我自己整理的 logcat 参数体系,你可以把它当成一个速查地图:

adb logcat 过滤类参数 输出控制类 缓冲区选择 -s Tag:优先级 --pid 进程ID -e 正则表达式 -v 格式选择 -d dump导出 -c 清空缓冲区 -b main -b crash -b events 实战组合示例 排查崩溃: -b crash -v threadtime -d | 实时监控: -s "Tag:W" -v color 💡 参数可以自由组合,按需取用

这张图把 logcat 的参数分成了三大类:过滤类、输出控制类、缓冲区选择。你不需要一次性记住所有参数,但至少要知道有这些工具存在。遇到具体问题时,知道该翻哪个口袋找工具。

好了,这一章的内容就到这里。参数这东西,光看是记不住的。我建议你打开终端,把今天讲的命令挨个敲一遍。敲完你会发现——原来以前都在用蛮力干活。


公众号:蓝海资料掘金营,微信deep3321