• logcat 命令行工具
    • 命令行语法
      • 选项
    • 启动 logcat
    • 过滤日志输出
    • 控制日志输出格式
    • 查看备用日志缓冲区
    • 查看 stdout 和 stderr
    • 通过代码记录日志

    logcat 命令行工具

    Logcat 是一个命令行工具,用于转储系统消息日志,其中包括设备引发错误时的堆叠追踪以及从您的应用使用 Log 类编写的消息。

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

    命令行语法

    1. [adb] logcat [<option>] ... [<filter-spec>] ...

    您可以 adb 命令的形式运行 logcat,或在模拟器或所连接设备的 shell 提示符中直接运行。若要使用 adb 查看日志输出,请导航到 SDK platform-tools/ 目录并执行:

    1. $ adb logcat

    您可以创建与设备相连的 shell 连接并执行:

    1. $ adb shell
    2. # logcat

    选项

    下表介绍的是 logcat 的命令行选项。

    选项说明
    -b <buffer>加载可供查看的备用日志缓冲区,如 eventsradio。默认情况下使用 main 缓冲区。请参阅查看备用日志缓冲区。
    -c清除(刷新)整个日志并退出。
    -d将日志转储到屏幕并退出。
    -f <filename>将日志消息输出写入 <filename>。默认值为 stdout
    -g打印指定日志缓冲区的大小并退出。
    -n <count>将已旋转日志的最大数量设置为 <count>。默认值为 4。 需要使用 -r 选项。
    -r <kbytes>每输出 <kbytes> 时旋转日志文件。默认值为 16。需要使用 -f 选项。
    -s将默认过滤器规则设为静默式。
    -v <format>设置日志消息的输出格式。默认值为 brief 格式有关支持的格式列表,请参阅控制日志输出格式。

    启动 logcat

    以下是通过 ADB shell 运行 logcat 的一般用法:

    1. [adb] logcat [<option>] ... [<filter-spec>] ...

    您可以从开发计算机或通过模拟器/设备实例中的远程 adb shell 使用 logcat 命令。在开发计算机中查看日志输出可使用

    1. $ adb logcat

    从远程 adb shell 查看日志输出可使用

    1. # logcat

    下表介绍的是 logcat 命令行选项:

    -c清除(刷新)整个日志并退出。
    -d将日志转储到屏幕并退出。
    -f <filename>将日志消息输出写入 <filename>。默认值为 stdout
    -g打印指定日志缓冲区的大小并退出。
    -n <count>将已旋转日志的最大数量设置为 <count>。默认值为 4。 需要使用 -r 选项。
    -r <kbytes>每输出 <kbytes> 时旋转日志文件。默认值为 16。需要使用 -f 选项。
    -s将默认过滤器规则设为静默式。
    -v <format>设置日志消息的输出格式。默认值为 brief 格式有关支持的格式列表,请参阅控制日志输出格式。

    过滤日志输出

    每个 Android 日志消息都有与其关联的标记优先级

    • 日志消息的标记是一个简短的字符串,其表示消息所源自的系统组件(例如,“View”代表视图系统)。
    • 优先级由以下某个字符值表示(按从最低到最高优先级的顺序排列):
      • V — 详细(最低优先级)
      • D — 调试
      • I — 信息
      • W — 警告
      • E — 错误
      • F — 致命
      • S — 静默(最高优先级,不会打印任何内容)
        通过运行 logcat 并观察每条消息的前两列,您可以获取系统中使用的标记列表及优先级,格式为 <priority>/<tag>

    下面是 logcat 输出的一个示例,其表明消息与优先级“I”和标记“ActivityManager”相关:

    1. I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}

    若要将日志输出降低到可管理的水平,您可以使用过滤器表达式限制日志输出。过滤器表达式允许您向系统表明您感兴趣的标记-优先级组合—系统针对指定的标记阻止其他消息。

    过滤器表达式遵循 tag:priority … 这个格式,其中 tag 表示感兴趣的标记,priority 表示将该标记报告的最低优先级。将优先级等于或高于指定优先级的标记的消息写入日志。您可以在一个过滤器表达式中提供任意数量的 tag:priority 规则。一系列规则使用空格分隔。

    下面是一个过滤器表达式的示例,该表达式将阻止除了带有标记“ActivityManager”、优先级等于或高于“信息”的日志消息以及带有标记“MyApp”、优先级等于或高于“调试”的日志消息外的所有其他日志消息。

    1. adb logcat ActivityManager:I MyApp:D *:S

    上述表达式中最后一个元素 :S 将所有标记的优先级设为“静默”,从而确保系统仅显示带有“ActivityManager”和“MyApp”标记的日志消息。使用 :S 可有效地确保日志输出受限于您已明确指定的过滤器 — 它允许过滤器充当日志输出的“白名单”。

    以下过滤器表达式显示所有标记上优先级等于或高于“警告”的所有日志消息:

    1. adb logcat *:W

    如果您从开发计算机运行 logcat(相对于在远程 adb shell 运行它),您也可以通过导出环境变量 ANDROID_LOG_TAGS 的值设置默认过滤器表达式:

    1. export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"

    请注意,如果您从远程 shell 或使用 adb shell logcat 运行 logcat,系统不会将 ANDROID_LOG_TAGS 过滤器导出到模拟器/设备实例。

    控制日志输出格式

    除标记和优先级外,日志消息还包含许多元数据字段。您可以修改消息的输出格式,以便它们可显示特定的元数据字段。为此,您可以使用 -v 选项,并指定下面列出的支持的输出格式之一。

    • brief — 显示优先级/标记以及发出消息的进程的 PID(默认格式)。
    • process — 仅显示 PID。
    • tag — 仅显示优先级/标记。
    • raw — 显示原始日志消息,不显示其他元数据字段。
    • time — 显示日期、调用时间、优先级/标记以及发出消息的进程的 PID。
    • threadtime — 显示日期、调用时间、优先级、标记以及发出消息的线程的 PID 和 TID。
    • long — 显示所有元数据字段,并使用空白行分隔消息。
      启动 logcat 时,您可以使用 -v 选项指定您需要的输出格式:
    1. [adb] logcat [-v <format>]

    下面的例子展示如何生成 thread 输出格式的消息:

    1. adb logcat -v thread

    请注意,使用 -v 选项,您只能指定一个输出格式。

    查看备用日志缓冲区

    Android 日志系统保留日志消息的多个循环缓冲区,而不是发送到默认循环缓冲区的所有日志消息。如需查看其他日志消息,您可以使用 -b 选项运行 logcat 命令,以请求查看备用循环缓冲区。您可以查看下列备用缓冲区的任意一个:

    • radio — 查看包含无线装置/电话相关消息的缓冲区。
    • events — 查看包含事件相关消息的缓冲区。
    • main — 查看主要日志缓冲区(默认值)
      以下是 -b 选项的用法:
    1. [adb] logcat [-b <buffer>]

    以下示例展示如何查看包含无线装置和电话消息的日志缓冲区。

    1. adb logcat -b radio

    查看 stdout 和 stderr

    默认情况下,Android 系统将 stdoutstderrSystem.outSystem.err)输出发送到 /dev/null。在运行 Dalvik VM 的进程中,您可以让系统将输出的副本写入日志文件。在此情况下,系统使用日志标记 stdoutstderr(优先级都是 I)将消息写入日志。

    要通过此方式路由输出,您需要停止运行的模拟器/设备实例,然后使用 shell 命令 setprop 以启用输出重定向。下面是具体做法:

    1. $ adb shell stop
    2. $ adb shell setprop log.redirect-stdio true
    3. $ adb shell start

    系统保留此设置,直至您终止模拟器/设备实例。若要在模拟器/设备实例上将此设置用作默认值,您可以在设备上向 /data/local.prop 添加一个条目。

    通过代码记录日志

    Log 类允许您在 logcat 工具中显示的代码中创建日志条目。常用的日志记录方法包括:

    • Log.v(String, String)(详细)
    • Log.d(String, String)(调试)
    • Log.i(String, String)(信息)
    • Log.w(String, String)(警告)
    • Log.e(String, String)(错误)
      例如,使用以下调用:
    1. Log.i("MyActivity", "MyClass.getView() — get item number " + position);

    logcat 输出类似于如下:

    1. I/MyActivity( 1557): MyClass.getView() get item number 1