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 每次重启 App 都会变。你如果杀掉进程再启动,得重新查一遍 PID。嗯,这确实有点烦人。

我在项目中遇到过一个问题:某个服务进程在后台偷偷抛异常,但主进程的日志太多,根本看不到。后来我就是用 --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。一步到位。

核心思路:包名过滤的本质还是 PID 过滤。只不过我们通过脚本把「查 PID」这一步自动化了。

你想想看,如果你同时调试多个 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 的日志。干净、专注。

避坑指南:我曾经在项目里犯过一个低级错误——所有地方都用同一个 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 还能更强大。