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。多线程排查时,这个格式能让你一眼看出哪个线程在搞事情。
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 会被过滤掉。
2.4 实战组合拳:一个完整的调试流程
光说不练假把式。咱们来一个完整的调试流程。
假设你的 App 在某个页面崩溃了。你会怎么做?
- 先清空缓冲区:
adb logcat -c,确保接下来的日志是干净的。 - 设置过滤:
adb logcat -s YourAppTag:E,只看错误级别的日志。 - 复现崩溃: 操作 App 直到崩溃。
- 查看日志: 如果日志太长,用
-t 100只看最后 100 行。 - 保存日志:
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 命令看着简单,但用好它,能让你在调试时游刃有余。下一章,咱们聊聊怎么在代码里优雅地打日志,以及那些你不得不知的日志最佳实践。