Logcat 是一种命令行工具,它会转储系统消息的日志,包括您使用 Log
类从应用程序中写入的消息。
本页面介绍的是命令行 logcat
工具,但您也可以从 Android Studio 的 Logcat 窗口查看日志消息。有关从 Android Studio 查看和筛选日志的信息,请参阅 使用 Logcat 查看和写入日志。
日志系统概述
Android 日志系统是一组由系统进程 logd
维持的结构化循环缓冲区。可用缓冲区集是固定的,由系统定义。最相关的缓冲区是
main
:存储大多数应用程序日志。system
:存储源自 Android 操作系统的消息。-
crash
:存储崩溃日志。每个日志条目都有一个优先级,一个标识日志来源的标签,以及实际的日志消息。
日志系统的首要 C/C++ 接口是共享库 liblog
及其头文件 <android/log.h>
。所有特定于语言的日志记录工具(包括 android.util.Log
)最终都会调用函数 __android_log_write
。默认情况下,它会调用函数 __android_log_logd_logger
,该函数使用套接字将日志条目发送到 logd
。从 API 级别 30 开始,可以通过调用 __android_set_log_writer
来更改日志记录函数。有关更多信息,请参阅 NDK 文档。
由 adb logcat
显示的日志经过四级筛选
- 编译时筛选
- 根据编译设置,某些日志可能完全从二进制文件中删除。例如,可以将 ProGuard 配置为从 Java 代码中删除对
Log.d
的调用。 - 系统属性筛选
liblog
查询一组系统属性以确定要发送到logd
的最低严重程度级别。如果您的日志的标签为MyApp
,则会检查以下属性,并且这些属性应包含最低严重程度的第一个字母 (V
、D
、I
、W
、E
或S
用于禁用所有日志)log.tag.MyApp
persist.log.tag.MyApp
log.tag
persist.log.tag
- 应用程序筛选
- 如果没有设置任何属性,
liblog
会使用__android_log_set_minimum_priority
设置的最低优先级。默认设置为INFO
。 - 显示筛选
adb logcat
支持其他筛选器,这些筛选器可以减少从logd
显示的日志数量。有关更多详细信息,请参阅关于 筛选日志输出 的部分。
命令行语法
要通过 adb
shell 运行 logcat
,一般的使用方法是
[adb] shell logcat [<option>] ... [<filter-spec>] ...
还有一种 adb logcat
的简写形式,但它只是扩展为 adb shell logcat
。
选项
logcat
拥有许多选项。可用的选项将取决于您正在使用的设备的操作系统版本。要查看适用于您正在使用的设备的 logcat
的帮助信息,请执行
adb logcat --help
请注意,由于 logcat
是针对操作系统开发人员和应用程序开发人员的工具(应用程序开发人员应使用 Android Studio 代替),因此许多选项只能以 root
身份使用。
筛选日志输出
日志消息的标签是一个简短的字符串,指示消息发源的系统组件。例如,"View" 代表视图系统。
优先级是以下字符值之一,按从最低优先级到最高优先级的顺序排列
V
:详细(最低优先级)D
:调试I
:信息W
:警告E
:错误F
:严重错误S
:静默(最高优先级,其中永远不会打印任何内容)
要获取系统中使用的标签列表及其优先级,请运行 logcat
并观察每条消息的前两列,以 <priority>/<tag>
的形式给出。
以下是使用 logcat -v brief output
命令获取的简短 logcat
输出示例。输出显示消息与优先级级别 "I" 和标签 "ActivityManager" 相关
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
为了将日志输出减少到可管理的水平,请使用 *过滤表达式* 来限制日志输出。过滤表达式允许您向系统指示您感兴趣的标签-优先级组合。系统会抑制指定标签的其他消息。
过滤表达式遵循以下格式 tag:priority ...
,其中 tag
表示感兴趣的标签,priority
表示要为该标签报告的最低优先级级别。该标签的优先级等于或高于指定优先级的消息将写入日志。在一个过滤表达式中提供任意数量的 tag:priority
规范。规范序列以空格分隔。
以下是一个过滤表达式的示例,它会抑制所有日志消息,除了标签为“ActivityManager”且优先级为“Info”或更高,以及标签为“MyApp”且优先级为“Debug”或更高的日志消息。
adb logcat ActivityManager:I MyApp:D *:S
前一个表达式中的最后一个元素 *:S
将所有标签的优先级级别设置为“静默”,这确保了只有“ActivityManager”和“MyApp”的日志消息才会显示。使用 *:S
可以确保日志输出仅限于您显式指定的过滤器。 *:S
使您的过滤器充当日志输出的允许列表。
注意:在某些 Shell 中,字符“*
”由 Shell 保留。如果您正在使用此类 Shell,请将过滤表达式用引号括起来: adb logcat "ActivityManager:I MyApp:D *:S"
以下过滤表达式将显示所有优先级级别为“警告”或更高的日志消息,无论标签如何。
adb logcat *:W
如果您从开发计算机运行 logcat
而不是在远程 adb
shell 上运行它,您还可以通过为环境变量 ANDROID_LOG_TAGS
导出值来设置默认过滤表达式。
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
如果您从远程 Shell 运行 logcat
或使用 adb shell logcat
,则不会将 ANDROID_LOG_TAGS
过滤器导出到模拟器/设备实例。
控制日志输出格式
除了标签和优先级之外,日志消息还包含许多元数据字段。您可以修改消息的输出格式,以便它们显示特定元数据字段。为此,请使用 -v
选项并指定以下支持的输出格式之一。
brief
:显示优先级、标签和发出消息的进程的 PID。long
:显示所有元数据字段,并用空行分隔消息。process
:仅显示 PID。raw
:显示原始日志消息,没有其他元数据字段。tag
:仅显示优先级和标签。thread:
这是一个旧格式,它显示优先级、PID 和发出消息的线程的 TID。threadtime
(默认):显示日期、调用时间、优先级、标签、PID 和发出消息的线程的 TID。time
:显示日期、调用时间、优先级、标签和发出消息的进程的 PID。
在启动 logcat
时,请使用 -v
选项指定所需的输出格式。
[adb] logcat [-v <format>]
以下示例显示如何生成 thread
输出格式的消息。
adb logcat -v thread
您只能使用 -v
选项指定一个输出格式。但是,您可以根据需要指定任意数量的修饰符,只要它们有意义。 logcat
会忽略没有意义的修饰符。
格式修饰符
格式修饰符会更改 logcat
输出。要指定格式修饰符,请使用 -v
选项,如下所示。
adb logcat -b all -v color -d
每个 Android 日志消息都有与其关联的标签和优先级。您可以将任何格式修饰符与以下任何一个格式选项组合。
brief
long
process
raw
tag
thread
threadtime
time
要格式化以下修饰符详细信息,请在命令行中输入 logcat -v --help
color
:使用不同的颜色显示每个优先级级别。descriptive
:显示日志缓冲区事件描述。此修饰符仅影响事件日志缓冲区消息,对其他非二进制缓冲区没有影响。事件描述来自 event-log-tags 数据库。epoch
:以自 1970 年 1 月 1 日起开始的秒数显示时间。monotonic
:以自上次启动起的 CPU 秒数显示时间。printable
:确保任何二进制日志记录内容都被转义。uid
:如果访问控制允许,则显示已记录进程的 UID 或 Android ID。usec
:显示时间,精确到微秒。UTC
:以 UTC 显示时间。year
:将年份添加到显示的时间。zone
:将本地时区添加到显示的时间。
查看备用日志缓冲区
Android 日志系统为日志消息保留多个循环缓冲区,并非所有日志消息都会发送到默认循环缓冲区。要查看其他日志消息,请运行带有 -b
选项的 logcat
命令以请求查看备用循环缓冲区。您可以查看以下任何备用缓冲区。
radio
:查看包含无线电/电话相关消息的缓冲区。events
:查看解释后的二进制系统事件缓冲区消息。main
:查看主日志缓冲区(默认),它不包含系统和崩溃日志消息。system
:查看系统日志缓冲区(默认)。crash
:查看崩溃日志缓冲区(默认)。all
:查看所有缓冲区。default
:报告main
、system
和crash
缓冲区。
-b
选项的用法为
[adb] logcat [-b <buffer>]
以下是如何查看包含无线电和电话消息的日志缓冲区的示例。
adb logcat -b radio
要为要打印的所有缓冲区指定多个 -b
标志,请输入以下内容。
logcat -b main -b radio -b events
为要查看的所有缓冲区指定一个 -b
标志,并用逗号分隔,例如。
logcat -b main,radio,events
从代码中记录
Log
类允许您在代码中创建日志条目,这些条目将在 logcat
工具中显示。常见的日志记录方法包括
Log.v(String, String)
(详细)Log.d(String, String)
(调试)Log.i(String, String)
(信息)Log.w(String, String)
(警告)Log.e(String, String)
(错误)
例如,使用以下调用
Kotlin
Log.i("MyActivity", "MyClass.getView() — get item number $position")
Java
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
logcat
输出类似于以下内容。
I/MyActivity( 1557): MyClass.getView() — get item number 1