Logcat 基本过滤:按日志级别过滤、按进程PID过滤、按应用包名过滤、按标签(Tag)过滤
好,咱们正式开始聊过滤。说实话,Logcat 刚出来那会儿,我第一反应是「这玩意儿怎么这么吵?」。满屏的日志刷刷刷地滚,根本找不到自己想要的东西。后来我才明白——不是 Logcat 不好用,是我不会用。
这一节,咱们就把最基础的四种过滤方式讲透。你掌握了这些,日常开发效率至少翻一倍。
按日志级别过滤
日志级别,说白了就是给每条日志贴个「严重程度」标签。Android 定义了从低到高六个级别:
| 级别 | 关键字 | 含义 | 我常用的场景 |
|---|---|---|---|
| Verbose | V | 啰嗦信息 | 几乎不用,太吵了 |
| Debug | D | 调试信息 | 开发阶段看细节 |
| Info | I | 普通信息 | 确认流程走到哪了 |
| Warning | W | 警告 | 发现潜在问题 |
| Error | E | 错误 | 定位崩溃、异常 |
| Assert | A | 断言失败 | 极少见,系统内部用 |
过滤命令很简单。比如我只想看 Error 及以上的日志:
adb logcat *:E
这里 *:E 的意思是「所有 Tag,只显示级别 >= Error 的」。同理,想看 Warning 及以上就用 *:W。
*:W。Info 太多,Error 又太少。Warning 刚好能帮我提前嗅到不对劲的地方。
为什么会这样?因为很多第三方库会在 Info 级别疯狂刷日志。你想想看,一个网络请求库每发一次请求就打印一行 Info,你的控制台瞬间就被淹没了。所以,我建议你根据当前任务灵活调整级别。
按进程 PID 过滤
有时候你只关心某个进程的日志。比如你的 App 崩溃了,但系统日志里混着几十个 App 的输出。这时候按 PID 过滤就派上用场了。
先找到目标进程的 PID:
adb shell ps | grep com.example.myapp
假设返回的 PID 是 12345,那么:
adb logcat --pid=12345
这样 Logcat 就只显示这个进程的日志了。干净利落。
我在项目中遇到过一个问题:某个服务进程在后台偷偷抛异常,但主进程的日志太多,根本看不到。后来我就是用 --pid 把服务进程单独拎出来,才定位到问题。说白了,PID 过滤就是「精准打击」。
按应用包名过滤
PID 会变,但包名不会。所以更常用的方式是按包名过滤。Android 提供了 --pid 的「升级版」——--pid 配合 ps 命令,或者直接用 --regex 匹配包名。
不过最方便的方式是:
adb logcat | grep com.example.myapp
但这样有个问题——grep 是在 PC 端过滤,日志还是先全部拉到电脑上,效率低。更好的做法是用 --pid 加包名查询:
adb logcat --pid=$(adb shell pidof -s com.example.myapp)
这条命令的意思是:先通过 pidof 拿到包名对应的 PID,然后传给 Logcat。一步到位。
你想想看,如果你同时调试多个 App,每个 App 都有自己的日志流。用包名过滤,就能做到「各看各的,互不干扰」。我个人习惯把这个命令存成一个别名,比如 logapp,省得每次敲一长串。
按标签(Tag)过滤
Tag 是 Android 日志系统里最灵活的一个维度。每个 Log.d()、Log.e() 调用时,第一个参数就是 Tag。你可以把它理解成「日志的类别名」。
比如你的网络层统一用 NetworkTag,UI 层用 UITag。过滤时:
adb logcat -s NetworkTag
-s 是 --silent 的缩写,意思是「只显示指定 Tag 的日志,其他全部静音」。你也可以组合多个 Tag:
adb logcat -s NetworkTag UITag
这样 Logcat 就只显示这两个 Tag 的日志。干净、专注。
"MyApp"。结果想过滤某个模块时,根本分不清。后来我强制团队每个模块用独立 Tag,比如 "MyApp-Network"、"MyApp-DB"。这才算真正用好了 Tag 过滤。
Tag 过滤还有一个妙用:配合级别过滤。比如只看 NetworkTag 的 Error 日志:
adb logcat NetworkTag:E *:S
这里 *:S 表示「其他所有 Tag 都静音」。说白了,就是只显示 NetworkTag 中级别为 Error 及以上的日志。这个组合拳非常实用。
综合一下:四种过滤怎么选?
我平时的工作流是这样的:
- 日常开发:按 Tag 过滤 + 级别 W。比如
adb logcat MyApp-Tag:W *:S。这样既能看到警告,又不会被 Info 刷屏。 - 定位崩溃:按包名过滤 + 级别 E。先找到崩溃的 App,再看 Error 日志。省得被系统日志干扰。
- 分析系统行为:按 PID 过滤。比如看 SystemServer 的日志,直接
--pid=system(部分设备支持)。 - 临时调试:直接
grep关键字。虽然效率低,但胜在简单,不用记命令。
你想想看,这四种过滤方式就像四把钥匙。用对了,Logcat 就是你的「显微镜」;用错了,它就是「噪音发生器」。我个人建议你从今天开始,强制自己用 -s 和 *:W 组合,坚持一周,你会回来感谢我的。
嗯,基本过滤就这些。下一节咱们聊更高级的玩法——正则表达式过滤和日志缓冲区定制。到时候你会发现,Logcat 还能更强大。