Logcat用法详解

发布时间:2025-12-09 18:10:01 浏览次数:8

概述

平常用logcat看日志或copy日志,实际是在logcat的一个可视化窗口上进行简单的read和copy,这个窗口是由logcat工具支撑的,并不是logcat的全部。

Android 日志记录系统是系统进程 logd 维护的一组结构化环形缓冲区。这组可用的缓冲区是固定的,并由系统定义。最相关的缓冲区为:main(用于存储大多数应用日志)、system(用于存储源自 Android 操作系统的消息)和 crash(用于存储崩溃日志)。每个日志条目都包含一个优先级、一个标识日志来源的标记以及实际的日志消息。优先级从最低到最高为:

  • V:Verbose (最低优先级)
  • D:Debug
  • I:Info
  • W:Warn
  • E:Error
  • F:Fatal
  • S:Silent (静默,最高优先级,绝不会输出任何内容)

日志记录系统的主接口是共享库 liblog 及其头文件 <android/log.h>。所有语言特定的日志记录工具最终都会调用函数__android_log_write。默认情况下,它会调用函数 __android_log_logd_logger,该函数使用套接字将日志条目发送到 logd。从 API 级别 30 开始,可通过调用 __android_set_log_writer 更改日志记录函数。

运行 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 logcat相关的内容

    adb logcat 详解

    一、一般用法

    adb logcat [options] [filterspecs]

    如需获取 logcat 在线帮助,请启动设备,然后执行以下命令:adb logcat -help

    二、选项介绍

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

    选项说明
    -s,将log级别设置为silent,相当于 ‘*:S’
    –pid=按pid打印log.
    -f , --file=Log输出到文件,只能是手机内部的路径。默认是输出到屏幕
    -r , --rotate-kbytes=限制单个log文件的大小(kb),必须跟-f指令一起使用
    -n , --rotate-count=设置输出log文件数的最大数目,默认值是4,需要跟-r和-f一起使用
    -c, --clear清除缓冲区全部log并退出,如果是文件输出,则清除文件设置。如需清除所有缓冲区,请使用 -b all -c。
    -e , --regex=只打印跟匹配的log行,是一个正则表达式
    -m , --max-count=打印最大 行数以后退出. 这是为了与–regex配对使用,但也可以单独运行.
    –print,与 --regex 和 --max-count 配对使用,可以使正则表达式以外的内容也可以打印出来,但能够在匹配最大数量以后停止。
    -v , --format=设置log的打印格式,格式包括: brief color epoch long monotonic printable process raw tag thread threadtime time uid usec UTC year zone
    -b , --buffer=加载查看指定的日志缓冲区信息,允许使用多个-b参数或逗号分隔的缓冲区列表,使其交替呈现。默认是-b main,system,crash。缓冲区包含: ‘main’(java层), ‘system’(系统组件), ‘radio’(通讯系统), ‘events’(event模块), ‘crash’, ‘default’ or ‘all’.
    -d,将缓冲区的log转存到屏幕中,然后退出(不会阻塞)
    -D, --piders在不同log缓冲区之间打印分隔符
    -g, --buffer-size打印日志缓冲区的大小并退出.
    -G , --buffer-size=设置log缓存区的大小,可以用K或M为单位.
    -t 打印指定数量的log行数(包含-d的功能)。count 就是数字
    -t ‘’打印指定时间以来log(包含-d的功能)。 time 的格式:‘MM-DD hh:mm:ss.mmm…’, ‘YYYY-MM-DD hh:mm:ss.mmm…’ or ‘sssss.mmm…’
    -T 打印指定数量的log行数(不包含-d的功能)
    -T ‘’打印指定时间以来log(不包含-d的功能)
    -L, -last转储最近一次重启之前的log
    -S, --statistics输出log的统计信息,可以帮助识别和定位日志垃圾信息发送者。
    -p, --prune打印修剪的黑白名单. 服务可以指定UID, UID/PID or /PID. 如果前缀为~,则称为更快的修剪,如果不加修饰,则是持久的.所有修剪活动是先进先出的。 ~是特殊情况! 表示对当前统计数据确定的噪声最大的UID的自动快速修剪
    -P ‘ …’, --prune=‘ …’设置修剪的黑白名单,使用与上面列出的格式相同的格式,必须被引用。
    –wrap,休眠 2 小时或者当缓冲区即将封装时(两者取其先)。通过提供即将封装唤醒来提高轮询的效率.
    -B, --binaryLog二进制输出.

    -b选项的日子缓冲区

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

    -v选项的格式简介

    • threadtime(默认值):显示日期、调用时间、优先级、标记、PID 以及发出消息的线程的 TID。
    • brief:显示优先级、标记以及发出消息的进程的 PID。
    • long:显示所有元数据字段,并使用空白行分隔消息。
    • process:仅显示 PID。
    • raw:显示不包含其他元数据字段的原始日志消息。
    • tag:仅显示优先级和标记。
    • thread:旧版格式,显示优先级、PID 以及发出消息的线程的 TID。
    • time:显示日期、调用时间、优先级、标记以及发出消息的进程的 PID。
    • color :不用优先级按不同颜色显示。
    • epoch:显示自 1970 年 1 月 1 日以来的时间(以秒为单位)。
    • monotonic:显示自上次启动以来的时间(以 CPU 秒为单位)。
    • printable:确保所有二进制日志记录内容都进行了转义。
    • uid:如果访问控制允许,则显示 UID 或记录的进程的 Android ID。
    • usec:显示精确到微秒的时间。
    • UTC:显示 UTC 时间。
    • year:将年份添加到显示的时间。
    • zone:将本地时区添加到显示的时间。

    三、过滤表达式

    1. tag:priority

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

    adb logcat ActivityManager:I MyApp:D *:S

    该表达式会抑制除标记为“ActivityManager”且优先级不低于“I”的日志消息,以及标记为“MyApp”且优先级不低于“D”的日志消息以外的所有其他日志消息。最后一个元素 *:S 将所有标记的优先级设为“静默”,从而确保系统仅显示标记为“ActivityManager”和“MyApp”的日志消息。使用 *:S 是确保日志输出受限于您已明确指定的过滤器的绝佳方式,它可以让过滤器充当日志输出的“许可名单”。

    adb logcat *:W

    该表达式显示了优先级不低于“警告”的所有标记的所有日志消息。

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

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

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

    2. -e <expr>, --regex=<expr>

    expr为正则表达式,使用正则表达式来过滤日子

    需要做网站?需要网络推广?欢迎咨询客户经理 13272073477