adb软件自动化测试底层学习(4)---Log

Android日志记录系统是系统进程logd维护的一组结构化环形缓冲区。这组缓存是固定的,由系统定义(main,system,crash)

  • main : 存储大多数应用日志
  • system : 用于存储源自Android操作系统消息
  • crash : 用于存储崩溃日志
    每个日志条目都包含一个优先级(VERBOSE、DEBUG、INFO、WARNING、ERROR 或 FATAL)、一个标识日志来源的标记以及实际的日志消息。

命令语法

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

同时也可以在shell环境下运行

$ adb shell 
# logcat [<option>] [<filter-spec>]

常用选项(option)

选项 说明
-b <buffer> 加载可供查看的备用日志缓冲区,例如 events 或 radio。默认使用 main、system 和 crash 缓冲区集
-c 清除(清空)所选的缓冲区并退出。默认缓冲区集为 main、system 和 crash。如需清除所有缓冲区,请使用 -b all -c。
-e <expr> 只输出日志消息与 <expr> 匹配的行,其中 是正则表达式。
-m<count> 输出 <count> 行后退出。这样是为了与 --regex 配对,但可以独立运行。
-d 将日志转储到屏幕并退出。
-v <format> 置日志消息的输出格式。默认格式为 threadtime。 查看日志输出格式
--pid 仅输出来自给定 PID 的日志。

查看备用日志缓冲区

Android 日志记录系统为日志消息保留了多个环形缓冲区,而且并非所有的日志消息都会发送到默认的环形缓冲区。如要查看其他日志消息,您可以使用 -b 选项运行 logcat 命令,以请求查看备用的环形缓冲区。您可以查看下列任意备用缓冲区:

  • radio:查看包含无线装置/电话相关消息的缓冲区。
  • events:查看已经过解译的二进制系统事件缓冲区消息。
  • main:查看主日志缓冲区(默认),不包含系统和崩溃日志消息。
  • system:查看系统日志缓冲区(默认)。
  • crash:查看崩溃日志缓冲区(默认)。
  • all:查看所有缓冲区。
  • default:报告 main、system 和 crash 缓冲区
adb logcat -b radio //指定radio
adb logcat -b main,radio,system //指定main,radio,system
adb logcat -b main -b radio -b system //指定main,radio,system

查看日志输出格式

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

  • brief:显示优先级、标记以及发出消息的进程的 PID。
  • long:显示所有元数据字段,并使用空白行分隔消息。
  • process:仅显示 PID。
  • raw:显示不包含其他元数据字段的原始日志消息。
  • tag:仅显示优先级和标记。
  • thread::旧版格式,显示优先级、PID 以及发出消息的线程的 TID。
  • threadtime(默认值):显示日期、调用时间、优先级、标记、PID 以及发出消息的线程的 TID。
  • time:显示日期、调用时间、优先级、标记以及发出消息的进程的 PID。

adb logcat -v brief//显示优先级标记&pid

过滤日志输出

  • 日志消息的标记(tag)是一个简短的字符串,指示消息所源自的系统组件(例如,“View”表示视图系统)。
  • 优先级(priority)是以下字符值之一(按照从最低到最高优先级的顺序排列):
    • V:详细(最低优先级)
    • D:调试
    • I:信息
    • W:警告
    • E:错误
    • F:严重错误
    • S:静默(最高优先级,绝不会输出任何内容)

通过运行 Logcat 并观察每条消息的前两列,可以获取系统中使用的带有优先级的标记列表,格式为<priority>/<tag>。

$ adb logcat -v brief --pid 707
$ I/tify.tv.androi(  707): Background concurrent copying GC freed 6351(355KB) AllocSpace objects, 14(280KB) LOS objects, 24% free, 2766KB/3688KB, paused 608us total 189.894ms

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

过滤器表达式采用 tag:priority ... 格式,其中 tag 指示您感兴趣的标记,priority 指示可针对该标记报告的最低优先级。不低于指定优先级的标记的消息会写入日志。您可以在一个过滤器表达式中提供任意数量的 tag:priority 规范。一系列规范使用空格分隔。

以下是一个过滤器表达式的示例,该表达式会抑制除标记为“ActivityManager”、优先级不低于“信息”的日志消息,以及标记为“MyApp”、优先级不低于“调试”的日志消息以外的所有其他日志消息:

adb logcat -v brief ActivityManager:I MyApp:D *:S
上述表达式中最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示标记为“ActivityManager”和“MyApp”的日志消息。使用 *:S 是确保日志输出受限于您已明确指定的过滤器的绝佳方式,它可以让过滤器充当日志输出的“许可名单”。

posted @ 2022-05-06 16:46  Mr_Ethic  阅读(121)  评论(0)    收藏  举报