- logcat 命令行工具
- 命令行语法
- 选项
- 启动 logcat
- 过滤日志输出
- 控制日志输出格式
- 查看备用日志缓冲区
- 查看 stdout 和 stderr
- 通过代码记录日志
- 命令行语法
logcat 命令行工具
Logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log
类编写的消息。
本页介绍命令行 logcat 工具,但在 Android Studio 中,您也可以从 Logcat 窗口查看日志消息。有关从 Android Studio 查看和过滤日志的信息,请参阅使用 Logcat 编写和查看日志。
命令行语法
- [adb] logcat [<option>] ... [<filter-spec>] ...
您可以 adb 命令的形式运行 logcat
,或在模拟器或所连接设备的 shell 提示符中直接运行。若要使用 adb 查看日志输出,请导航到 SDK platform-tools/
目录并执行:
- $ adb logcat
您可以创建与设备相连的 shell 连接并执行:
- $ adb shell
- # logcat
选项
下表介绍的是 logcat
的命令行选项。
选项 | 说明 |
---|---|
-b <buffer> | 加载可供查看的备用日志缓冲区,如 events 或 radio 。默认情况下使用 main 缓冲区。请参阅查看备用日志缓冲区。 |
-c | 清除(刷新)整个日志并退出。 |
-d | 将日志转储到屏幕并退出。 |
-f <filename> | 将日志消息输出写入 <filename> 。默认值为 stdout 。 |
-g | 打印指定日志缓冲区的大小并退出。 |
-n <count> | 将已旋转日志的最大数量设置为 <count> 。默认值为 4。 需要使用 -r 选项。 |
-r <kbytes> | 每输出 <kbytes> 时旋转日志文件。默认值为 16。需要使用 -f 选项。 |
-s | 将默认过滤器规则设为静默式。 |
-v <format> | 设置日志消息的输出格式。默认值为 brief 格式有关支持的格式列表,请参阅控制日志输出格式。 |
启动 logcat
以下是通过 ADB shell 运行 logcat 的一般用法:
- [adb] logcat [<option>] ... [<filter-spec>] ...
您可以从开发计算机或通过模拟器/设备实例中的远程 adb shell 使用 logcat
命令。在开发计算机中查看日志输出可使用
- $ adb logcat
从远程 adb shell 查看日志输出可使用
- # logcat
下表介绍的是 logcat
命令行选项:
-c | 清除(刷新)整个日志并退出。 |
-d | 将日志转储到屏幕并退出。 |
-f <filename> | 将日志消息输出写入 <filename> 。默认值为 stdout 。 |
-g | 打印指定日志缓冲区的大小并退出。 |
-n <count> | 将已旋转日志的最大数量设置为 <count> 。默认值为 4。 需要使用 -r 选项。 |
-r <kbytes> | 每输出 <kbytes> 时旋转日志文件。默认值为 16。需要使用 -f 选项。 |
-s | 将默认过滤器规则设为静默式。 |
-v <format> | 设置日志消息的输出格式。默认值为 brief 格式有关支持的格式列表,请参阅控制日志输出格式。 |
过滤日志输出
每个 Android 日志消息都有与其关联的标记和优先级。
- 日志消息的标记是一个简短的字符串,其表示消息所源自的系统组件(例如,“View”代表视图系统)。
- 优先级由以下某个字符值表示(按从最低到最高优先级的顺序排列):
V
— 详细(最低优先级)D
— 调试I
— 信息W
— 警告E
— 错误F
— 致命S
— 静默(最高优先级,不会打印任何内容)
通过运行 logcat 并观察每条消息的前两列,您可以获取系统中使用的标记列表及优先级,格式为<priority>/<tag>
。
下面是 logcat 输出的一个示例,其表明消息与优先级“I”和标记“ActivityManager”相关:
- I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
若要将日志输出降低到可管理的水平,您可以使用过滤器表达式限制日志输出。过滤器表达式允许您向系统表明您感兴趣的标记-优先级组合—系统针对指定的标记阻止其他消息。
过滤器表达式遵循 tag:priority …
这个格式,其中 tag
表示感兴趣的标记,priority
表示将该标记报告的最低优先级。将优先级等于或高于指定优先级的标记的消息写入日志。您可以在一个过滤器表达式中提供任意数量的 tag:priority
规则。一系列规则使用空格分隔。
下面是一个过滤器表达式的示例,该表达式将阻止除了带有标记“ActivityManager”、优先级等于或高于“信息”的日志消息以及带有标记“MyApp”、优先级等于或高于“调试”的日志消息外的所有其他日志消息。
- adb logcat ActivityManager:I MyApp:D *:S
上述表达式中最后一个元素 :S
将所有标记的优先级设为“静默”,从而确保系统仅显示带有“ActivityManager”和“MyApp”标记的日志消息。使用 :S
可有效地确保日志输出受限于您已明确指定的过滤器 — 它允许过滤器充当日志输出的“白名单”。
以下过滤器表达式显示所有标记上优先级等于或高于“警告”的所有日志消息:
- adb logcat *:W
如果您从开发计算机运行 logcat(相对于在远程 adb shell 运行它),您也可以通过导出环境变量 ANDROID_LOG_TAGS
的值设置默认过滤器表达式:
- export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
请注意,如果您从远程 shell 或使用 adb shell logcat
运行 logcat,系统不会将 ANDROID_LOG_TAGS
过滤器导出到模拟器/设备实例。
控制日志输出格式
除标记和优先级外,日志消息还包含许多元数据字段。您可以修改消息的输出格式,以便它们可显示特定的元数据字段。为此,您可以使用 -v
选项,并指定下面列出的支持的输出格式之一。
brief
— 显示优先级/标记以及发出消息的进程的 PID(默认格式)。process
— 仅显示 PID。tag
— 仅显示优先级/标记。raw
— 显示原始日志消息,不显示其他元数据字段。time
— 显示日期、调用时间、优先级/标记以及发出消息的进程的 PID。threadtime
— 显示日期、调用时间、优先级、标记以及发出消息的线程的 PID 和 TID。long
— 显示所有元数据字段,并使用空白行分隔消息。
启动 logcat 时,您可以使用-v
选项指定您需要的输出格式:
- [adb] logcat [-v <format>]
下面的例子展示如何生成 thread
输出格式的消息:
- adb logcat -v thread
请注意,使用 -v
选项,您只能指定一个输出格式。
查看备用日志缓冲区
Android 日志系统保留日志消息的多个循环缓冲区,而不是发送到默认循环缓冲区的所有日志消息。如需查看其他日志消息,您可以使用 -b
选项运行 logcat
命令,以请求查看备用循环缓冲区。您可以查看下列备用缓冲区的任意一个:
radio
— 查看包含无线装置/电话相关消息的缓冲区。events
— 查看包含事件相关消息的缓冲区。main
— 查看主要日志缓冲区(默认值)
以下是-b
选项的用法:
- [adb] logcat [-b <buffer>]
以下示例展示如何查看包含无线装置和电话消息的日志缓冲区。
- adb logcat -b radio
查看 stdout 和 stderr
默认情况下,Android 系统将 stdout
和 stderr
(System.out
和 System.err
)输出发送到 /dev/null
。在运行 Dalvik VM 的进程中,您可以让系统将输出的副本写入日志文件。在此情况下,系统使用日志标记 stdout
和 stderr
(优先级都是 I
)将消息写入日志。
要通过此方式路由输出,您需要停止运行的模拟器/设备实例,然后使用 shell 命令 setprop
以启用输出重定向。下面是具体做法:
- $ adb shell stop
- $ adb shell setprop log.redirect-stdio true
- $ adb shell start
系统保留此设置,直至您终止模拟器/设备实例。若要在模拟器/设备实例上将此设置用作默认值,您可以在设备上向 /data/local.prop
添加一个条目。
通过代码记录日志
Log
类允许您在 logcat 工具中显示的代码中创建日志条目。常用的日志记录方法包括:
Log.v(String, String)
(详细)Log.d(String, String)
(调试)Log.i(String, String)
(信息)Log.w(String, String)
(警告)Log.e(String, String)
(错误)
例如,使用以下调用:
- Log.i("MyActivity", "MyClass.getView() — get item number " + position);
logcat 输出类似于如下:
- I/MyActivity( 1557): MyClass.getView() — get item number 1