Logcat 命令行工具

Logcat 命令行工具

Logcat 是一个命令行工具,用于转储系统消息日志,其中包括您使用 Log 类从应用中编写的消息。

本页面介绍的是命令行 logcat 工具,但您也可以在 Android Studio 的 Logcat 窗口中查看日志消息。有关从 Android Studio 查看和过滤日志的信息,请参阅使用 Logcat 查看和编写日志。

日志系统概述

Android 日志系统是由系统进程 logd 维护的一组结构化循环缓冲区。可用缓冲区的集合是固定的,由系统定义。最相关的缓冲区包括:

main:存储大多数应用日志。

system:存储源自 Android 操作系统的消息。

crash:存储崩溃日志。每个日志条目都有一个优先级、一个标识日志来源的标签以及实际的日志消息。

访问日志系统的主要 C/C++ 接口是共享库 liblog 及其头文件 。所有特定于语言的日志记录设施(包括 android.util.Log)最终都会调用函数 __android_log_write。默认情况下,它会调用函数 __android_log_logd_logger,该函数通过 socket 将日志条目发送到 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 [

adb logcat 也有简写形式,但它只是 adb shell logcat 的扩展。

选项

logcat 有很多选项。可用的选项取决于您使用的设备的操作系统版本。要查看特定于您所用设备的 logcat 帮助信息,请执行:

adb logcat --help

请注意,由于 logcat 既是面向操作系统开发者的工具,也是面向应用开发者的工具(预计应用开发者会改用 Android Studio),因此许多选项只能作为 root 用户使用。

过滤日志输出

日志消息的标签是一个短字符串,用于指示消息源自哪个系统组件。例如,“View”表示视图系统。

优先级是以下字符值之一,按优先级从低到高排列:

V:详细 (Verbose)(最低优先级)

D:调试 (Debug)

I:信息 (Info)

W:警告 (Warning)

E:错误 (Error)

F:致命 (Fatal)

S:静默 (Silent)(最高优先级,不打印任何内容)

要获取系统中使用的标签及其优先级的列表,请运行 logcat 并观察每条消息的前两列,以 / 形式给出。

以下是使用 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"

以下过滤表达式显示所有标签中优先级为“warning”及以上的全部日志消息:

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 ]

以下示例展示了如何以 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 ]

以下是如何查看包含无线电和电话消息的日志缓冲区的示例:

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

相关推荐

薄幸的意思
365bet赌场官网

薄幸的意思

01-31 🌱 3705
喝鸡汤会失眠吗
365bet亚洲官方

喝鸡汤会失眠吗

06-17 🌱 4358
11月份领屠龙活动,错过还等一年?别怪我没提醒你!