Android Studio 中的**Logcat**窗口可通过实时显示设备的日志来帮助您调试应用,例如:使用Log
类添加到应用中的消息、在Android上运行的服务的消息或系统消息(例如,垃圾回收发生时)。当应用抛出异常时,Logcat会显示一条消息,后跟关联的堆栈跟踪,其中包含指向代码行的链接。
开始使用 Logcat 窗口
要查看应用的日志消息,请执行以下操作。
- 在 Android Studio 中,构建并运行您的应用在物理设备或模拟器上。
- 从菜单栏中选择**查看 > 工具窗口 > Logcat**。
默认情况下,Logcat 会滚动到末尾。在 Logcat 视图中单击或使用鼠标滚轮向上滚动会关闭此功能。要重新打开它,请单击工具栏中的**滚动到末尾** 。您还可以使用工具栏清除、暂停或重新启动 Logcat。
图 1. Logcat 格式化日志,以便更容易扫描有用的信息(例如标签和消息)并识别不同类型的日志(例如警告和错误)。
如何阅读日志
每个日志都有关联的日期、时间戳、进程和线程 ID、标签、包名、优先级和消息。不同的标签具有独特的颜色,有助于识别日志的类型。每个日志条目都具有FATAL
、ERROR
、WARNING
、INFO
、DEBUG
或VERBOSE
的优先级。
例如,以下日志消息的优先级为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 选项卡。右键单击选项卡可以重命名和重新排列它。
此外,您可以在选项卡内拆分视图,以便更容易比较两组日志。要创建拆分,请在日志视图中右键单击或单击工具栏中的**拆分面板**选项,然后选择**向右拆分**或**向下拆分**。要关闭拆分,请右键单击并选择**关闭**。每个拆分都允许您设置自己的设备连接、视图选项和查询。
图 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 分钟内记录的消息。
否定和正则表达式
以下字段支持否定和正则表达式匹配:tag
、package
、message
和line
。
否定通过在字段名前面添加-
来表示。例如,-tag:MyTag
匹配tag
不包含字符串MyTag
的日志条目。
正则表达式匹配通过在字段名后附加~
来表示。例如,tag~:My.*Tag
。
否定和正则表达式修饰符可以组合使用。例如,-tag~:My.*Tag
。
逻辑运算符和括号
查询语言支持由&
和|
表示的AND
和OR
运算符以及括号。例如
(tag:foo | level:ERROR) & package:mine
请注意,会强制执行正常的运算符优先级,因此以下内容
tag:foo | level:ERROR & package:mine
将评估为
tag:foo | (level:ERROR & package:mine)
隐式逻辑运算符
如果不应用逻辑运算符,则查询语言会自动将多个非否定的key-value
筛选器项与相同的键作为OR
进行评估,并将所有其他内容与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
匹配任何日志级别为INFO
、WARN
、ERROR
或ASSERT
的日志条目。级别不区分大小写。有效级别为:VERBOSE
、DEBUG
、INFO
、WARN
、ERROR
和ASSERT
。
age
age
查询根据条目时间戳匹配条目,并格式化为age:<number><unit>
,其中
<number>
是整数<unit>
是s
、m
、h
和d
之一(秒、分钟、小时和天)。
给定以下列表,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:
键使收藏的查询更容易识别。有关更多信息,请参阅特殊查询。
图 4. 通过点击查询旁边的星号来收藏查询。
跟踪应用崩溃和重启期间的日志
当 Logcat 发现您的应用进程已停止并重新启动时,它会在输出中显示一条消息,例如 PROCESS ENDED
和 PROCESS STARTED
。重新启动 Logcat 会保留您的会话配置(例如选项卡拆分、过滤器和视图选项),以便您可以轻松地继续您的会话。
图 5. 当您的应用进程重新启动时,Logcat 会打印一条消息,指示进程已结束然后启动。