Save the date! Android Dev Summit is coming to Mountain View, CA on November 7-8, 2018.

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> 加载可供查看的备用日志缓冲区,如 eventsradio。默认情况下使用 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 系统将 stdoutstderrSystem.outSystem.err)输出发送到 /dev/null。在运行 Dalvik VM 的进程中,您可以让系统将输出的副本写入日志文件。在此情况下,系统使用日志标记 stdoutstderr(优先级都是 I)将消息写入日志。

要通过此方式路由输出,您需要停止运行的模拟器/设备实例,然后使用 shell 命令 setprop 以启用输出重定向。下面是具体做法:

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

系统保留此设置,直至您终止模拟器/设备实例。若要在模拟器/设备实例上将此设置用作默认值,您可以在设备上向 /data/local.prop 添加一个条目。

通过代码记录日志

Log 类允许您在 logcat 工具中显示的代码中创建日志条目。常用的日志记录方法包括:

例如,使用以下调用:

Log.i("MyActivity", "MyClass.getView() — get item number " + position);

logcat 输出类似于如下:

I/MyActivity( 1557): MyClass.getView() — get item number 1