7、Logcat 过滤的艺术:按 Tag、Priority、PID 进行精准过滤。

说实话,刚接触 Android 开发那会儿,我最怕的就是看 Logcat。满屏的日志像瀑布一样往下刷,眼睛都快看花了,就是找不到自己 App 打的那条 log。后来我才明白——不是日志太多,是我不会过滤。

今天我们就聊聊过滤的艺术。说白了,就是怎么从一堆乱七八糟的日志里,精准地捞出你想要的那条信息。

7.1 按 Tag 过滤:最常用的招数

Tag 是什么?就是每条日志前面的那个标签。比如 MainActivitySystem.outart 这些。我个人习惯,写代码时一定会给每个类定义一个统一的 Tag:

private static final String TAG = "MainActivity";

然后在命令行里这样过滤:

adb logcat -s MainActivity

或者用 grep:

adb logcat | grep MainActivity

这两种方式有什么区别?-s 是静默模式,只显示你指定的 Tag,其他的一概不输出。而 grep 是文本过滤,它会在所有日志里搜索包含 "MainActivity" 的行。

我的小技巧: 如果你同时想看多个 Tag,可以用 -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 你的包名 就能查到。

我曾经踩过的坑: 有一次我调试一个多进程的 App,发现日志里有些信息莫名其妙消失了。查了半天才发现,原来我过滤的是主进程的 PID,但那个日志是在子进程里打的。所以如果你发现日志对不上,先确认一下 PID 对不对。

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 过滤的核心逻辑。你可以把它当作一个快速参考:

Logcat 过滤核心逻辑 Logcat 日志流 按 Tag 过滤 按 Priority 过滤 按 PID 过滤 adb logcat -s Tag adb logcat | grep Tag adb logcat *:E adb logcat *:W adb logcat --pid=12345 adb shell ps | grep 包名 组合过滤:Tag + Priority + PID

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