2、Logcat基础:Logcat命令格式详解、常用选项(-v、-s、-f、-g等)、日志优先级(V/D/I/W/E/F)含义

好,咱们正式开始上手干活了。

上一章我们聊了日志系统到底是个什么玩意儿。这一章,咱们直接打开终端,敲命令。Logcat 是 Android 调试的「听诊器」,你想想看,一个医生要是不会用听诊器,那还看什么病?

我个人习惯,每天打开 Android Studio 第一件事,就是先开个终端窗口,随时准备敲 logcat。别嫌麻烦,这玩意儿用熟了,比断点调试快十倍。

2.1 Logcat 命令格式:其实就三板斧

Logcat 的命令格式,说白了就是:

adb logcat [选项] [过滤器]

就这么简单。adb 是桥梁,logcat 是工具,后面跟的是你的「调参」指令。

我记得刚入行那会儿,有个同事 debug 从来不敲命令,全靠 AS 的图形界面。结果有一次线上崩溃,日志量巨大,图形界面直接卡死。他急得满头大汗,我过去敲了一行 adb logcat -g 看了下缓冲区大小,又加了个 -s 过滤,三秒定位问题。从那以后,他再也不敢只用鼠标了。

2.2 常用选项详解:这些是你吃饭的家伙

选项很多,但常用的就这几个。我按使用频率给你排个序。

2.2.1 -v:控制输出格式

-v 选项控制日志的「长相」。默认格式只显示日期、PID、TAG 和消息。但有时候你需要更多信息。

格式 说明 我的使用场景
brief 默认格式,简洁 日常调试,信息够用
time 显示时间和日期 排查性能问题时必用
threadtime 显示线程ID和时间 多线程问题,我最常用这个
long 显示所有元数据 需要完整上下文时
color 按优先级着色 眼睛看花了就用它

举个例子:

adb logcat -v threadtime

这条命令会输出类似这样的日志:

03-15 14:23:45.678  1234  5678 D MyTag: 这是一条调试日志

看到了吗?第一列是日期时间,第二列是 PID,第三列是 TID。多线程排查时,这个格式能让你一眼看出哪个线程在搞事情。

我的小技巧: 我习惯在 ~/.bashrc 里加个别名:alias logt='adb logcat -v threadtime'。敲三个字母就能用,省事。

2.2.2 -s:过滤器的「杀手锏」

-s 是静默模式,说白了就是「我只想看我想看的」。它会隐藏所有默认的日志输出,只显示你指定的 TAG 和优先级。

adb logcat -s MyTag:D

这条命令的意思是:只看 TAG 为 MyTag 且优先级 >= DEBUG 的日志。其他的一概不要。

我曾经遇到过一个 bug,系统日志每秒刷几百行,根本看不清。用 -s 加上应用包名过滤,整个世界清净了。嗯,这里要注意:-s 后面跟的是 TAG:优先级 的配对,多个配对用空格隔开。

adb logcat -s MyTag:D YourTag:E

2.2.3 -f:把日志写到文件里

终端看日志,滚动太快容易错过。这时候 -f 就派上用场了。它能把日志直接写入文件。

adb logcat -f /sdcard/log.txt

注意:这个路径是设备上的路径,不是电脑上的。如果你想保存到电脑,得用重定向:

adb logcat > ~/Desktop/my_log.txt
避坑指南: 我曾经在项目上线前抓日志,用 -f 写到了 /data 目录下,结果因为权限不足,日志根本没写进去。排查了半天才发现是路径权限问题。建议优先写到 /sdcard/ 下,或者用重定向到电脑。

2.2.4 -g:看看缓冲区有多大

-g 用来查看日志缓冲区的大小和使用情况。这个命令我用的频率不高,但关键时刻能救命。

adb logcat -g

输出类似:

main: ring buffer size 256Kb, max 256Kb, consumed 12Kb (5%)
system: ring buffer size 256Kb, max 256Kb, consumed 8Kb (3%)
crash: ring buffer size 256Kb, max 256Kb, consumed 0Kb (0%)

如果你发现 consumed 接近 100%,说明日志在疯狂输出,旧的日志会被覆盖。这时候要么加缓冲区大小,要么赶紧把日志导出来。

2.2.5 其他常用选项

选项 说明 使用场景
-c 清空缓冲区 开始新的一轮调试前
-d 打印日志后退出 只想看当前缓冲区内容
-t 只显示最近的 N 行 日志太多时快速查看尾部
-b 指定缓冲区类型 查看 crash 或 events 日志

举个例子,只看最近的 50 行 crash 日志:

adb logcat -b crash -t 50

2.3 日志优先级:V/D/I/W/E/F 到底啥意思?

优先级是日志的「等级标签」。Android 定义了 6 个级别,从低到高分别是:

缩写 全称 含义 我的理解
V Verbose 啰嗦模式 开发时随便打,上线前删掉
D Debug 调试信息 排查问题时用,平时关掉
I Info 普通信息 记录关键流程,比如「登录成功」
W Warning 警告 可能有问题,但还没崩
E Error 错误 出错了,需要立即关注
F Fatal 致命错误 应用要挂了,赶紧看

优先级是「向上包含」的。什么意思?你设置 MyTag:I,那么 I、W、E、F 都会显示,但 V 和 D 会被过滤掉。

重点: 上线版本一定要把 V 和 D 日志关掉。我见过一个 App 因为忘记关 Debug 日志,导致日志文件撑爆了用户存储空间。用户差评如潮,最后紧急发版才解决。

2.4 实战组合拳:一个完整的调试流程

光说不练假把式。咱们来一个完整的调试流程。

假设你的 App 在某个页面崩溃了。你会怎么做?

  1. 先清空缓冲区: adb logcat -c,确保接下来的日志是干净的。
  2. 设置过滤: adb logcat -s YourAppTag:E,只看错误级别的日志。
  3. 复现崩溃: 操作 App 直到崩溃。
  4. 查看日志: 如果日志太长,用 -t 100 只看最后 100 行。
  5. 保存日志: adb logcat -d > crash_log.txt,把日志导出到电脑。

这一套组合拳下来,90% 的崩溃问题都能定位。剩下的 10%,可能需要结合 -b crash 看 native 层的崩溃信息。

我的习惯: 我一般会在终端开两个窗口。一个窗口跑 adb logcat -v threadtime -s MyApp:D 看应用日志,另一个窗口跑 adb logcat -b crash 看崩溃日志。两边对照着看,效率翻倍。

2.5 避坑指南:我踩过的那些坑

最后,分享几个我实际踩过的坑,你遇到了能少走弯路。

  • 坑一:日志太多导致卡顿。 我曾经在一个性能测试中开了全量日志,结果手机直接卡成 PPT。后来学乖了,调试时只用 -s 过滤。
  • 坑二:缓冲区溢出。 日志量太大,旧的日志被覆盖了。用 -g 监控缓冲区使用率,必要时用 adb logcat -G 1M 增大缓冲区。
  • 坑三:权限问题。 有些设备限制了普通应用读取系统日志。这时候要么 root,要么用 adb shell 提权。

好了,这一章的内容就到这里。Logcat 命令看着简单,但用好它,能让你在调试时游刃有余。下一章,咱们聊聊怎么在代码里优雅地打日志,以及那些你不得不知的日志最佳实践。