adb logcat说明

1.Android log系统

Android子系统框图 图片来自https://www.cnblogs.com/jianxu/p/5468839.html
Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用使用 Log 类写入的消息。开发者选项中有个选项叫做“日志记录器缓冲区大小”,可以手动设置,日志是循环写入环形缓冲区的,在通常情况下,写满时最旧的日志会被删除以给新输出的日志保留内存空间。
日志记录系统的主接口是共享库 liblog 及其头文件 <android/log.h>。所有语言特定的日志记录工具最终都会调用函数 __android_log_write。默认情况下,它会调用函数 __android_log_logd_logger,该函数使用套接字将日志条目发送到 logd。从 API 级别 30 开始,可通过调用 __android_set_log_writer 更改日志记录函数。

日志消息的格式为:

date time PID-TID/package priority/tag: message

例如,下面的日志消息的优先级为 V,标记为 AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

PID 代表进程标识符,TID 则为线程标识符;如果仅有一个线程,两者可以相同

2.日志缓冲区

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

3.日志优先级

每个日志条目都包含一个优先级(VERBOSE、DEBUG、INFO、WARNING、ERROR 或 FATAL)、一个标识日志来源的标记以及实际日志消息。
日志消息的标记是一个简短的字符串,指示消息所源自的系统组件(例如,“View”表示视图系统)。
优先级是以下字符值之一(按照从最低到最高优先级的顺序排列):

优先级说明
V详细(最低优先级)
D调试
I信息
W警告
E错误
F严重错误
S静默(最高优先级,绝不会输出任何内容)

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

priority/tag

以下是使用 logcat -v brief output 命令获取的简短 Logcat 输出的示例。它表明消息与优先级“I”和标记“ActivityManager”相关:

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

4.日志过滤

运行 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 显示的日志数量的过滤条件。
可以使用过滤器表达式限制日志输出。通过过滤器表达式,您可以向系统指明您感兴趣的标记/优先级组合,系统会针对指定的标记抑制其他消息。

5.过滤器

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

示例:显示标记为“ActivityManager”、优先级不低于“信息”的日志消息,以及标记为“MyApp”、优先级不低于“调试”的日志消息:

adb logcat ActivityManager:I MyApp:D *:S

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

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

adb logcat *:W

如果通过adb sehll,则也可以通过导出环境变量 ANDROID_LOG_TAGS 的值设置默认过滤器表达式:

export ANDROID_LOG_TAGS=“ActivityManager:I MyApp:D *:S”

注:此种方式系统不会将 ANDROID_LOG_TAGS 过滤器导出到模拟器/设备实例。

将程序运行在前台,通过命令查看应用包名称

adb shell dumpsys | findstr “mFocusedActivity”

6.控制日志输出格式

除标记和优先级外,日志消息还包含许多元数据字段。您可以修改消息的输出格式,以便它们显示特定的元数据字段。为此,您可以使用 -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 会忽略没有意义的修饰符。

各种格式如下图所示:
在这里插入图片描述

7.格式修饰符

格式修饰符依据以下一个或多个修饰符的任意组合更改 Logcat 输出。如要指定格式修饰符,请使用
-v 选项,如下所示:

adb logcat -b all -v color -d

可以通过在命令行中输入 logcat -v --help 获取格式修饰符详细信息。

格式修饰符说明
color使用不同的颜色来显示每个优先级
descriptive显示日志缓冲区事件说明。此修饰符仅影响事件日志缓冲区消息,不会对其他非二进制 文件缓冲区产生任何影响。事件说明取自 event-log-tags 数据库。
epoch显示自 1970 年 1 月 1 日以来的时间(以秒为单位)。
monotonic显示自上次启动以来的时间(以 CPU 秒为单位)。
printable确保所有二进制日志记录内容都进行了转义。
uid如果访问控制允许,则显示 UID 或记录的进程的 Android ID。
usec显示精确到微秒的时间。
UTC显示 UTC 时间。
year将年份添加到显示的时间。
zone将本地时区添加到显示的时间。

8.通过代码记录日志

通过 Log 类,您可以在代码中创建日志条目,而这些条目会显示在 Logcat 工具中。常用的日志记录方法包括:

Log.v(String, String)(详细)
Log.d(String, String)(调试)
Log.i(String, String)(信息)
Log.w(String, String)(警告)
Log.e(String, String)(错误)

使用以下调用:

Log.i(“MyActivity”, “MyClass.getView() — get item number $position”)

Logcat 输出类似如下

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

9.常用logcat命令

抓取所有缓冲区log

adb logcat -b all

监听crash信息

adb logcat -b crash

抓取kernel日志信息

adb logcat -b kernel

10.logcat日志分析(TODO)

参考:https://blog.csdn.net/weixin_41354919/article/details/106285668

参考文档

  1. https://developer.android.com/studio/command-line/logcat?hl=zh-cn
  2. https://www.cnblogs.com/jianxu/p/5468839.html logcat命令详解
  3. https://www.cnblogs.com/jingdenghuakai/p/11363427.html logcat日志信息
  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值