7、Logcat 过滤的艺术:按 Tag、Priority、PID 进行精准过滤。
说实话,刚接触 Android 开发那会儿,我最怕的就是看 Logcat。满屏的日志像瀑布一样往下刷,眼睛都快看花了,就是找不到自己 App 打的那条 log。后来我才明白——不是日志太多,是我不会过滤。
今天我们就聊聊过滤的艺术。说白了,就是怎么从一堆乱七八糟的日志里,精准地捞出你想要的那条信息。
7.1 按 Tag 过滤:最常用的招数
Tag 是什么?就是每条日志前面的那个标签。比如 MainActivity、System.out、art 这些。我个人习惯,写代码时一定会给每个类定义一个统一的 Tag:
private static final String TAG = "MainActivity";
然后在命令行里这样过滤:
adb logcat -s MainActivity
或者用 grep:
adb logcat | grep MainActivity
这两种方式有什么区别?-s 是静默模式,只显示你指定的 Tag,其他的一概不输出。而 grep 是文本过滤,它会在所有日志里搜索包含 "MainActivity" 的行。
-s 加多个参数。比如 adb logcat -s MainActivity:V MyService:V,这样两个 Tag 的日志就都能看到了。
7.2 按 Priority 过滤:只看你想看的级别
Priority 就是日志的优先级。Android 定义了从低到高这么几个级别:
| 级别 | 缩写 | 含义 | 使用场景 |
|---|---|---|---|
| VERBOSE | V | 啰嗦模式 | 开发调试时最细粒度的信息 |
| DEBUG | D | 调试信息 | 开发阶段打印的调试日志 |
| INFO | I | 普通信息 | 关键流程、状态变化 |
| WARN | W | 警告 | 可能有问题但不影响运行 |
| ERROR | E | 错误 | 发生了异常或严重问题 |
| FATAL | F | 致命错误 | 会导致进程崩溃 |
你想想看,如果我只想看错误信息,那就可以这样:
adb logcat *:E
这个 *:E 的意思是:所有 Tag,只显示 ERROR 及以上级别的日志。嗯,这里要注意,FATAL 也会被包含进来,因为它是比 ERROR 更高级别的。
我在项目中遇到过一个问题:某个功能在线上偶尔会崩溃,但本地怎么都复现不了。后来我让测试同学把 *:W 级别的日志全部抓回来,才发现是一个第三方库在特定场景下抛了个警告,然后引发了连锁反应。所以有时候,WARN 级别的日志也不能完全忽略。
7.3 按 PID 过滤:精准定位进程
PID 就是进程 ID。每个 Android 应用运行的时候,系统都会给它分配一个唯一的 PID。如果你同时开了多个 App,或者你的 App 有多个进程,那按 Tag 过滤可能就不够用了。
举个例子,你的 App 有主进程和推送进程,它们可能都用同一个 Tag 打日志。这时候你就需要 PID 来区分:
adb logcat --pid=12345
怎么知道 PID 是多少?用 adb shell ps | grep 你的包名 就能查到。
7.4 组合过滤:让过滤更强大
单独用 Tag、Priority、PID 已经很方便了,但把它们组合起来用,才是真正的艺术。
比如我想看 MainActivity 这个 Tag 的 ERROR 级别日志,同时只看 PID 为 12345 的进程:
adb logcat -s MainActivity:E --pid=12345
或者用 grep 实现更灵活的过滤:
adb logcat | grep "MainActivity.*E/"
这个正则的意思是:找到包含 "MainActivity" 并且后面跟着 "E/" 的行。因为 Logcat 的格式是 Tag: Priority/消息内容,所以 E/ 就代表 ERROR 级别。
我个人更推荐用 -s 加 --pid 的方式,因为它是 Logcat 原生支持的过滤,性能更好,不会漏掉日志。用 grep 虽然灵活,但有时候会因为缓冲区问题导致丢日志。
7.5 知识体系一览
下面这张图,是我梳理的 Logcat 过滤的核心逻辑。你可以把它当作一个快速参考:
7.6 实战中的一些建议
最后,分享几个我在实际项目中总结出来的经验:
- 开发阶段: 用
adb logcat -s 你的Tag:V,把所有级别的日志都打开,方便排查问题。 - 测试阶段: 用
adb logcat -s 你的Tag:W,只关注警告和错误,减少干扰。 - 线上问题: 如果用户反馈了崩溃,让 TA 用
adb logcat *:E --pid=进程ID抓取日志,这样信息最集中。 - 多进程 App: 建议每个进程的 Tag 加上进程名后缀,比如
MainActivity_push,这样按 Tag 过滤时就能区分开了。
核心要点: 过滤不是把日志变少,而是让有用的信息浮出水面。用好 Tag、Priority、PID 这三个维度,你就能在 Logcat 的海洋里精准捕捞。
好了,这一章的内容就到这里。记住这些过滤技巧,下次看 Logcat 的时候,你会发现自己效率提升了一大截。
公众号:蓝海资料掘金营,微信deep3321