使用 Logcat 查看日志

Android Studio 中的 Logcat 窗口可帮助您调试应用,它会实时显示来自设备的日志,例如:使用 Log 类添加到应用中的消息、在 Android 上运行的服务的消息或系统消息(例如,当发生垃圾回收时)。当应用抛出异常时,Logcat 会显示一条消息,后面跟着关联的堆栈跟踪,其中包含指向代码行的链接。

开始使用 Logcat 窗口

要查看应用的日志消息,请执行以下操作。

  1. 在 Android Studio 中,构建并运行您的应用,该应用在物理设备或模拟器上运行。
  2. 从菜单栏中选择 查看 > 工具窗口 > Logcat

默认情况下,Logcat 会滚动到末尾。单击 Logcat 视图或使用鼠标滚轮向上滚动会关闭此功能。要重新打开它,请从工具栏中单击 滚动到末尾 滚动到末尾图标。您还可以使用工具栏清除、暂停或重新启动 Logcat。

The Logcat window UI

图 1. Logcat 会格式化日志,以便于扫描有用的信息(例如,标签和消息)并识别不同类型的日志(例如,警告和错误)。

如何阅读日志

每个日志都与日期、时间戳、进程和线程 ID、标签、包名、优先级和消息相关联。不同的标签具有独特的颜色,有助于识别日志类型。每个日志条目都有一个优先级,分别是FATALERRORWARNINGINFODEBUGVERBOSE

例如,以下日志消息的优先级为 DEBUG,标签为 ProfileInstaller

2022-12-29 04:00:18.823 30249-30321 ProfileInstaller        com.google.samples.apps.sunflower    D  Installing profile for com.google.samples.apps.sunflower

配置日志视图

标准日志视图显示每个日志的日期、时间、进程和线程 ID、标签、包名、优先级以及关联的消息。默认情况下,消息行在日志视图中不会换行,但您可以使用 Logcat 工具栏中的 **软换行** 软换行图标 选项。

您可以通过点击 Logcat 工具栏中的 **配置 Logcat 格式化选项** 切换到 **紧凑** 视图,该视图默认显示的信息较少。

要进一步配置要显示的信息量,请选择 **修改视图**,然后选择是否要查看时间戳、标签、进程 ID 或包名。

更改配色方案

要更改配色方案,请导航到 **Android Studio** > **设置** > **编辑器** > **配色方案**。要更改日志视图的配色方案,请选择 **Android Logcat**。要更改过滤器配色方案,请选择 **Logcat 过滤器**。

其他配置选项

有关其他配置选项,请导航到 **Android Studio** > **设置** > **工具** > **Logcat**。在这里,您可以选择 Logcat 循环缓冲区大小、新 Logcat 窗口的默认过滤器,以及是否要从历史记录中添加过滤器以进行自动完成。

在多个窗口中使用 Logcat

选项卡可帮助您轻松地在不同的设备或查询之间切换。您可以通过点击 **新建选项卡** 新建选项卡图标 创建多个 Logcat 选项卡。右键点击选项卡可以重命名和重新排列它。

此外,您还可以拆分选项卡中的视图,以帮助您更轻松地比较两组日志。要创建拆分,请在日志视图中右键点击,或点击工具栏中的 **拆分面板** 选项,然后选择 **向右拆分** 或 **向下拆分**。要关闭拆分,请右键点击并选择 **关闭**。每个拆分都可以设置自己的设备连接、视图选项和查询。

多个 Logcat 窗口 图 2. 在 Android Studio 中拆分 **Logcat** 窗口。

从 **Logcat** 工具栏中,您可以滚动到日志的末尾,也可以点击特定行以使该行保持可见。

在 Android Studio 中,您可以直接从主查询字段生成键值搜索。该查询系统可以提供您要查询内容的准确性,还可以根据键值排除日志。虽然您可以选择使用正则表达式,但您不必依赖它们来进行查询。要查看建议,请在查询字段中按 Ctrl + Space

查询字段中的建议列表 图 3. 在查询字段中按 Ctrl + Space 可查看建议查询列表。

以下是一些您可以在查询中使用的键示例

  • tag:与日志条目的 tag 字段匹配。
  • package:与记录应用程序的包名匹配。
  • process:与记录应用程序的进程名匹配。
  • message:与日志条目的消息部分匹配。
  • level:与指定的或更严重的日志级别匹配 - 例如,DEBUG
  • age:如果条目时间戳是最近的,则匹配。值为一个数字,后跟一个字母,指定时间单位:s 表示秒,m 表示分钟,h 表示小时,d 表示天。例如,age: 5m 仅筛选过去 5 分钟内记录的消息。

否定和正则表达式

以下字段支持否定和正则表达式匹配:tagpackagemessageline

否定通过在字段名前添加 - 来表示。例如,-tag:MyTag 匹配其 tag 不包含字符串 MyTag 的日志条目。

正则表达式匹配通过在字段名后添加 ~ 来表示。例如,tag~:My.*Tag

否定和正则表达式修饰符可以组合使用。例如,-tag~:My.*Tag

逻辑运算符和括号

查询语言支持由 &| 表示的 ANDOR 运算符以及括号。例如

(tag:foo | level:ERROR) & package:mine

请注意,将强制执行正常的运算符优先级,因此以下内容

tag:foo | level:ERROR & package:mine

将被评估为

tag:foo | (level:ERROR & package:mine)

隐式逻辑运算符

如果未应用逻辑运算符,查询语言将自动使用 OR 评估具有相同键的多个非否定 key-value 过滤器项,并使用 AND 评估其他所有项。

例如

tag:foo tag:bar package:myapp

将被评估为

(tag:foo | tag:bar) & package:myapp

但是

tag:foo -tag:bar package:myapp

将被评估为

tag:foo & -tag:bar & package:myapp

如果多个查询项由空格分隔,但没有逻辑运算符,则它们将被视为具有较低优先级的 AND。例如,foo bar tag:bar1 | tag:bar2 等效于 'foo bar' & (tag: bar1 | tag: bar2)

特殊查询

package:mine

package 键支持一个特殊值 mine。此特殊值匹配打开项目中包含的任何包名。

level

level 查询与 Logcat 消息的日志级别匹配,其中日志条目级别大于或等于查询级别。

例如,level:INFO 匹配任何日志级别为 INFOWARNERRORASSERT 的日志条目。级别不区分大小写。有效级别为:VERBOSEDEBUGINFOWARNERRORASSERT

age

age 查询根据条目时间戳匹配条目,并格式化为 age:<number><unit>,其中

  • <number> 是一个整数
  • <unit>smhd 之一(秒、分钟、小时和天)。

给定以下列表,age 查询匹配时间戳在值描述的范围内内的日志消息。例如:查询 age:5m 匹配时间戳不早于 5 分钟前的条目。

age:30s
age:5m
age:3h
age:1d

请注意,时间戳与主机的时间戳进行比较,而不是与连接的设备进行比较。如果设备的时间未正确设置,则此查询可能无法按预期工作。

is

您可以按以下方式使用 is

  • is:crash 匹配代表应用程序崩溃(本机或 Java)的日志条目。
  • is:stacktrace 匹配代表任何看起来像 Java 堆栈跟踪的日志条目,无论日志级别如何。

name

name 键允许您为保存的过滤器提供一个唯一的名称,以便它在过滤器历史记录下拉菜单中易于识别。虽然您不会因多次指定 name 而收到错误,但 IDE 仅在查询中使用最后一个指定的 name 值。

查看查询历史记录

您可以通过点击查询字段旁边的 **显示历史记录** 过滤器图标 查看您的查询历史记录。要将查询设为收藏,以便它在所有 Studio 项目中都保持在列表顶部,请点击它旁边的星号。您还可以使用 name: 键使收藏的查询更容易识别。有关更多信息,请参阅 特殊查询

UI for favoriting a query

图 4. 通过点击它旁边的星号将查询设为收藏。

跟踪应用程序崩溃和重启期间的日志

当 Logcat 注意到您的应用程序进程已停止并重新启动时,它会在输出中显示一条消息,例如 PROCESS ENDEDPROCESS STARTED。重新启动 Logcat 会保留您的会话配置,例如选项卡拆分、过滤器和视图选项,以便您可以轻松地继续您的会话。

Logcat window for app crashes

图 5. 当您的应用程序进程重新启动时,Logcat 会打印一条消息,指出该进程已结束,然后启动。