Logcat — 是什么,日志级别以及如何使用日志

作者: IT Sectr 发布日期: 2026-05-06 阅读时间: 8 分钟

Logcat — 是 Android SDK 的工具,用于实时查看系统消息和应用程序日志,可通过 ADB 或 Android Studio 的内置控制台访问。根据 Android Developers,Logcat 收集所有系统进程的消息,按重要级别和标签进行过滤,让开发者能够诊断错误、跟踪代码执行和分析性能。Logcat — 是调试 Android 应用程序时的主要信息来源。

要点

  • Logcat — Android Studio 中的控制台窗口,用于实时查看 Android 系统日志
  • 日志级别 — VERBOSE、DEBUG、INFO、WARN、ERROR、ASSERT — 决定消息的重要性和过滤阈值
  • 过滤 按标签、级别和关键词筛选,可以从整体流中分离出特定应用程序的日志
  • ADB logcat — 终端命令,无需 Android Studio,通过 USB 或 Wi-Fi 访问日志
  • 崩溃日志 带有堆栈跟踪的异常会自动进入 Logcat,包含完整的崩溃诊断

Android 中的 Logcat 是什么

Logcat — 是 Android 的系统缓冲区,所有进程(包括 Linux 内核、system_server 和应用程序)都以特定格式写入消息。作为 Android SDK 一部分的 logcat 工具读取此缓冲区并实时显示消息。从 Android 4.1(API 16)开始,对 Logcat 的访问受到限制:应用程序只能读取自己的日志,而系统日志可通过 ADB 的调试访问获取。

每个 Logcat 消息包含五个字段:日期和时间、PID(进程标识符)、TID(线程标识符)、日志级别和标签。格式是固定的,对所有 Android 版本都相同。这使得可以在 CI/CD 管道中使用 grep、awk 和 sed 工具过滤日志,而无需依赖 IDE。

日志存储在固定大小的循环缓冲区中:main 为 256 KB,system 为 256 KB,events 为 256 KB(Android 5+)。缓冲区溢出时,旧消息将被删除。开发者可以通过 PROP logcat.size 或在设备的开发者设置中更改缓冲区大小。

日志级别和标签:Logcat 消息结构

六个级别的日志记录决定了消息的重要性。Android 使用与其他平台类似的标准级别,但在 Log 类中有自己的常量名称。选择正确的级别有助于有效过滤日志,避免关键消息被次要消息淹没。

级别常量用途默认显示
VERBOSELog.v最详细的调试信息
DEBUGLog.d给开发者的调试消息
INFOLog.i关于应用程序运行的信息消息
WARNLog.w关于潜在问题的警告
ERRORLog.e严重错误和异常
ASSERTLog.wtf原则上不应该发生的错误

标签:按模块组织消息

标签 (tag) — 最多 23 个字符的字符串,用于标识消息来源。建议使用类名或模块名作为标签:MainActivity、AuthManager、NetworkModule。这样可以按应用程序的特定组件过滤日志。为了团队的一致性,可以在单独的文件中创建标签常量,或使用 Timber 库,它会根据类名自动设置标签。

崩溃日志和异常堆栈跟踪

当发生 未处理的异常时,Android 会自动在 Logcat 中写入完整的堆栈跟踪,包括类、方法、代码行和调用链。崩溃日志包含异常类型(NullPointerException、RuntimeException)、消息以及从崩溃点到应用程序入口点的调用顺序。要分析来自用户设备的崩溃日志,可使用 Firebase Crashlytics,它会将堆栈跟踪与混淆映射(Android 的 mapping.txt)同步。

Android Studio 中的 Logcat:界面、过滤器和搜索

Android Studio 提供了 Logcat 的图形界面,可通过 View → Tool Windows → Logcat(Alt + 6)访问。Logcat 窗口实时更新,显示已连接设备的所有消息,并允许配置灵活的过滤器以从整体流中提取所需信息。

按级别和标签过滤

下拉列表 Log Level 按最低级别过滤消息:选择 WARN 可仅查看警告和错误,隐藏 VERBOSE、DEBUG 和 INFO。搜索字段允许按消息文本或标签搜索 — 支持正则表达式,便于按模式搜索消息。

已保存的过滤器

Saved Filters — Android Studio 中 Logcat 的强大功能。您可以创建一个过滤器,仅显示带有应用程序标签(tag:MyApp)和 WARN+ 级别的消息。过滤器在会话之间保存,并可从下拉列表中访问。对于多模块项目,请为每个模块创建单独的过滤器。

text
# 用于过滤应用程序日志的示例表达式
tag:"MyApp" level:WARN # 仅 MyApp 的 WARN+
package:"com.mycompany" # 包的所有日志
-tag:"okhttp" # 排除 OkHttp 日志

导出和分析

Logcat 日志可通过 Save to File 图标导出到文本文件。这对于附加到 Jira 工单或分析长时间会话非常有用。导出的日志可以在任何文本编辑器中打开,并应用 grep 搜索模式。对于格式化查看,可使用 logcat-color 工具。

ADB logcat:高级使用的终端命令

ADB logcat — Logcat 的控制台版本,通过 Android Debug Bridge 访问。其主要优点是可以运行在 CI 服务器、自动化脚本以及没有 Android Studio 的设备上。ADB logcat 支持与 GUI 相同的所有过滤器,但具有命令行的灵活性。

基本命令

adb logcat 命令不带参数时会实时显示整个缓冲区。使用 Ctrl+C 停止。-c 标志在开始记录前清除缓冲区 — 当需要将当前测试的日志与之前的消息隔离时非常方便。-b 标志选择缓冲区类型:main、system、events、crash(Android 12+)。

bash
# 清除缓冲区并使用标签 MyApp 开始记录日志
adb logcat -c
adb logcat MyApp:D *:S

# 将日志保存到文件
adb logcat -d > logcat_dump.txt

# 按进程的 PID 过滤
adb logcat --pid=12345

使用 grep 和 awk 过滤

ADB 与 Unix 工具的组合提供了最大的灵活性。例如,过滤器 "*:S TAG:D" 仅显示带有标签 TAG 且级别为 DEBUG 及以上的消息,隐藏所有其他消息。要仅查看 Exception,使用 grep -i exception。要分析错误频率,在标签列上应用 sort | uniq -c。

CI/CD 中的 Logcat

CI 服务器上,Logcat 用于在运行 UI 测试时收集诊断信息。典型的管道:在测试开始前清空缓冲区,测试执行后将日志转储保存为构建产物。如果测试失败,可根据日志确定失败是由 ANR、未处理的异常还是网络超时引起的。

代码中的日志记录:Log.d、Log.e 和 Timber

android.util.Log 类 — 用于向 Logcat 写入消息的内置 API。Log.v、Log.d、Log.i、Log.w、Log.e 和 Log.wtf 接受标签(字符串)和消息(字符串)或消息 + Throwable。要格式化消息,请使用 String.format 或 Kotlin String templates — 避免字符串拼接,这会在堆中创建额外的对象。

Timber 库

Timber — Jake Wharton 的流行库,消除了内置 Log API 的缺点。Timber 根据调用日志记录的类名自动设置标签,并且不需要在每次调用时传递标签。Timber 还支持条件日志记录:在 Release 构建中,可以通过 Application.onCreate 中的一行代码禁用 Timber.v 和 Timber.d 调用。

kotlin
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 内置日志 API
        Log.d("MainActivity", "onCreate called")

        // Timber — 基于类名的自动标签
        Timber.d("onCreate called")
    }

    private fun loadData() {
        try {
            val result = fetchFromNetwork()
            Timber.i("Data loaded: $result")
        } catch (e: IOException) {
            Timber.e(e, "Failed to load data")
        }
    }
}

Release 的条件日志记录

Release 构建中,建议禁用 VERBOSE 和 DEBUG 日志,以减少 Logcat 缓冲区的负载并防止敏感信息泄漏。Timber 通过 PlantingTree 解决此问题:在 Debug 变体中植入 DebugTree(记录所有内容),在 Release 中植入 CrashReportingTree(仅通过 Crashlytics 记录 ERROR)。内置 Log API 不支持条件日志记录 — 开发者必须将每次调用包装在 if (BuildConfig.DEBUG) 中。

常见问题

如何在运行测试前清除 Logcat 缓冲区?

使用 命令 adb logcat -c 在运行测试前清除缓冲区。或者,在 Android Studio 中点击 Logcat 窗口中的 Clear Logcat 按钮(垃圾桶)。清除操作不会影响其他进程的系统缓冲区,仅影响当前连接。

如何增加 Logcat 缓冲区的大小?

执行 adb logcat -G 2M 将缓冲区增加到 2 MB。最大大小取决于设备:在 Android 10+ 上最高可达 16 MB。更改会保留到设备重启。对于永久配置,请在 device tree 中使用 build.prop。

为什么 Logcat 不显示应用程序的日志?

可能的原因:应用程序在 Release 模式下运行(Timber.v/d 日志已禁用),Logcat 过滤器隐藏了所需的级别,或者您连接到了错误的设备。同时检查 Android Studio 中是否选择了应用程序进程,而不是 system_process。

如何从 Logcat 中读取崩溃日志?

找到包含 FATAL EXCEPTION 的行,其下方是完整的堆栈跟踪。第一行包含异常类型和消息,后续行是调用链,包含文件和代码行号。使用 grep "FATAL EXCEPTION" 在所有日志中快速搜索。

什么是 ANR,如何在 Logcat 中检测它?

ANR(Application Not Responding) — 主线程(UI 线程)被阻塞超过 5 秒的情况。在 Logcat 中,ANR 显示为带有标签 ActivityManager 和文本 "ANR in ..." 以及所有线程的堆栈跟踪的消息。使用过滤器 tag:ActivityManager level:ERROR。

总结

  • Logcat — Android 系统缓冲区,可通过 ADB 和 Android Studio 内置窗口访问
  • 六个级别的日志记录(VERBOSE — ASSERT)决定了消息的重要性和过滤阈值
  • 标签允许按应用程序模块对消息进行分组,以便快速过滤
  • ADB logcat 配合 grep/awk 比 GUI 界面更灵活,适用于 CI/CD 管道
  • Timber 简化了日志记录,自动设置标签,并在 Release 中禁用 Debug 级别
  • 崩溃日志包含异常和堆栈跟踪,每次崩溃时自动进入 Logcat
  • 已保存的过滤器在 Android Studio 中加快日常日志分析

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读