Android日志[进阶篇]三-Logcat 命令行工具
Android日志[进阶篇]一-使用 Logcat 写入和查看日志
Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)
Android日志[进阶篇]三-Logcat命令行工具
Android日志[进阶篇]四-获取错误报告
Android日志[进阶篇]五-阅读错误报告
目录
- 日志记录系统概览
- 命令行语法
- logcat命令行选项
- 过滤日志输出
- 控制日志输出格式
- 格式修饰符
- 查看备用日志缓冲区
- 通过代码记录日志
前言:平常用logcat看日志或copy日志,实际是在logcat的一个可视化窗口上进行简单的read和copy,这个窗口是由logcat工具支撑的,并不是logcat的全部。
Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及App使用 Log
类写入的消息。
本文介绍了命令行 Logcat 工具,但在 Android Studio 中,可以从 Logcat 窗口查看日志消息。如需了解如何在 Android Studio 中查看和过滤日志,请参阅Android日志[进阶篇]一-使用 Logcat 写入和查看日志。
日志记录系统概览
Android 日志记录系统是系统进程 logd
维护的一组结构化环形缓冲区。这组可用的缓冲区是固定的,并由系统定义。最相关的缓冲区为:main
(用于存储大多数应用日志)、system
(用于存储源自 Android 操作系统的消息)和 crash
(用于存储崩溃日志)。每个日志条目都包含一个优先级(VERBOSE
、DEBUG
、INFO
、WARNING
、ERROR
或 FATAL
)、一个标识日志来源的标记以及实际的日志消息。
日志记录系统的主接口是共享库 liblog
及其头文件 <android/log.h>
。所有语言特定的日志记录工具最终都会调用函数 __android_log_write
。默认情况下,它会调用函数 __android_log_logd_logger
,该函数使用套接字将日志条目发送到 logd
。从 API 级别 30 开始,可通过调用 __android_set_log_writer
更改日志记录函数。如需了解详情,请参阅 NDK 文档。
运行 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 shell 运行 Logcat,一般用法如下:
[adb] logcat [<option>] … [<filter-spec>] …
可以将 logcat
作为 adb 命令运行,也可以直接在模拟器或关联设备的 shell 提示中运行。如需使用 adb 查看日志输出,请转到SDK platform-tools/
(配置了环境变量的话,可以直接打开命令行窗口即可运行) 目录并执行以下命令:
adb logcat
如需获取 logcat
在线帮助,请启动设备,然后执行以下命令:
adb logcat --help
可以建立与设备的 shell 连接并执行以下命令:
$ adb shell
logcat命令行选项
下表介绍了 logcat
的命令行选项。
选项 | 说明 |
---|---|
-b <buffer>
|
加载可供查看的备用日志缓冲区,例如 events 或 radio 。默认使用 main 、system 和 crash 缓冲区集。请参阅查看备用日志缓冲区。
|
-c, --clear
|
清除(清空)所选的缓冲区并退出。默认缓冲区集为 main 、system 和 crash 。如需清除所有缓冲区,请使用 -b all -c 。
|
-e <expr>, --regex=<expr>
|
只输出日志消息与 <expr> 匹配的行,其中 <expr> 是正则表达式。
|
-m <count>, --max-count=<count>
|
输出 <count> 行后退出。这样是为了与 --regex 配对,但可以独立运行。
|
--print
|
与 --regex 和 --max-count 配对,使内容绕过正则表达式过滤器,但仍能够在获得适当数量的匹配时停止。
|
-d
|
将日志转储到屏幕并退出。 |
-f <filename>
|
将日志消息输出写入 <filename> 。默认值为 stdout 。
|
-g, --buffer-size
|
输出指定日志缓冲区的大小并退出。 |
-n <count>
|
将轮替日志的数量上限设置为 <count> 。默认值为 4。需要使用 -r 选项。
|
-r <kbytes>
|
每输出 <kbytes> 时轮替日志文件。默认值为 16。需要 -f 选项。
|
-s
|
相当于过滤器表达式 '*:S' ;它将所有标记的优先级设为“静默”,并用于放在可添加内容的过滤器表达式列表之前。如需了解详情,请转到介绍过滤日志输出的部分。
|
-v <format>
|
设置日志消息的输出格式。默认格式为 threadtime 。如需查看支持的格式列表,请参阅介绍控制日志输出格式的部分。
|
-D, --dividers
|
输出各个日志缓冲区之间的分隔线。 |
-c
|
清空(清除)整个日志并退出。 |
-t <count>
|
仅输出最新的行数。此选项包括 -d 功能。
|
-t '<time>'
|
输出自指定时间以来的最新行。此选项包括 -d 功能。如需了解如何引用带有嵌入空格的参数,请参阅 -P 选项。 adb logcat -t '01-26 20:52:41.820'
|
-T <count>
|
输出自指定时间以来的最新行数。此选项不包括 -d 功能。
|
-T '<time>'
|
输出自指定时间以来的最新行。此选项不包括 -d 功能。如需了解如何引用带有嵌入空格的参数,请参阅 -P 选项。 adb logcat -t '01-26 20:52:41.820'
|
-L, --last
|
在最后一次重新启动之前转储日志。 |
-B, --binary
|
以二进制文件形式输出日志。 |
-S, --statistics
|
在输出中包含统计信息,以帮助您识别和定位日志垃圾信息发送者。 |
-G <size>
|
设置日志环形缓冲区的大小。可以在结尾处添加 K 或 M ,以指示单位为千字节或兆字节。
|
-p, --prune
|
输出(读取)当前的允许 (white ) 列表和拒绝 (black ) 列表,不采用任何参数,如下所示: adb logcat -p
|
-P '<list> ...'
|
写入(设置)允许 (white ) 列表和拒绝 (black ) 列表以出于特定目的调整日志记录内容。您可以提供允许 (<white> ) 列表和拒绝 (~<black> ) 列表条目的混合内容,其中 <white> 或 <black> 可以是 UID、UID/PID 或 /PID。在 logcat 统计信息 (logcat -S ) 的指导下,您可以考虑出于各种目的调整允许 (white ) 列表和拒绝 (black ) 列表,例如:
默认情况下,日志记录系统会自动以动态方式阻止日志统计信息中最严重的违规内容,以便为新的日志消息腾出空间。一旦它用尽启发法,系统便会删除最旧的条目,以便为新消息腾出空间。 添加许可名单 ( 引号
以下示例指定了一个包含 PID 32676 和 UID 675 的允许 (
其他您可以使用的允许 ( ~! worst uid blacklist ~1000/! worst pid in system (1000) |
--pid=<pid> ...
|
仅输出来自给定 PID 的日志。 |
--wrap
|
休眠 2 小时或者当缓冲区即将封装时(两者取其先)。通过提供即将封装唤醒来提高轮询的效率。 |
过滤日志输出
- 日志消息的标记是一个简短的字符串,指示消息所源自的系统组件(例如,“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...}
如要将日志输出降低到可管理的水平,您可以使用过滤器表达式限制日志输出。通过过滤器表达式,您可以向系统指明您感兴趣的标记/优先级组合,系统会针对指定的标记抑制其他消息。
过滤器表达式采用 tag:priority ...
格式,其中 tag
指示您感兴趣的标记,priority
指示可针对该标记报告的最低优先级。不低于指定优先级的标记的消息会写入日志。您可以在一个过滤器表达式中提供任意数量的 tag:priority
规范。一系列规范使用空格分隔。
以下是一个过滤器表达式的示例,该表达式会抑制除标记为“ActivityManager”、优先级不低于“信息”的日志消息,以及标记为“MyApp”、优先级不低于“调试”的日志消息以外的所有其他日志消息:
adb logcat ActivityManager:I MyApp:D *:S
上述表达式中最后一个元素 *: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
过滤器导出到模拟器/设备实例。
控制日志输出格式
除标记和优先级外,日志消息还包含许多元数据字段。您可以修改消息的输出格式,以便它们显示特定的元数据字段。为此,您可以使用 -v
选项,并指定下列某一受支持的输出格式。
brief
:显示优先级、标记以及发出消息的进程的 PID。long
:显示所有元数据字段,并使用空白行分隔消息。process
:仅显示 PID。raw
:显示不包含其他元数据字段的原始日志消息。tag
:仅显示优先级和标记。thread:
:旧版格式,显示优先级、PID 以及发出消息的线程的 TID。threadtime
(默认值):显示日期、调用时间、优先级、标记、PID 以及发出消息的线程的 TID。time
:显示日期、调用时间、优先级、标记以及发出消息的进程的 PID。
启动 Logcat 时,您可以使用 -v
选项指定所需的输出格式:
[adb] logcat [-v <format>]
以下示例显示了如何生成输出格式为 thread
的消息:
adb logcat -v thread
请注意,您只能使用 -v
选项指定一种输出格式,但可以指定任意数量的有意义的修饰符。Logcat 会忽略没有意义的修饰符。
格式修饰符
格式修饰符依据以下一个或多个修饰符的任意组合更改 Logcat 输出。如要指定格式修饰符,请使用 -v
选项,如下所示:
adb logcat -b all -v color -d
每个 Android 日志消息都有一个与之相关联的标记和优先级。可以将任何格式修饰符与以下任一格式选项进行组合:brief
、long
、process
、raw
、tag
、thread
、threadtime
和 time
。
可以通过在命令行中输入 logcat -v --help
获取格式修饰符详细信息。
color
:使用不同的颜色来显示每个优先级。descriptive
:显示日志缓冲区事件说明。此修饰符仅影响事件日志缓冲区消息,不会对其他非二进制文件缓冲区产生任何影响。事件说明取自 event-log-tags 数据库。epoch
:显示自 1970 年 1 月 1 日以来的时间(以秒为单位)。monotonic
:显示自上次启动以来的时间(以 CPU 秒为单位)。printable
:确保所有二进制日志记录内容都进行了转义。uid
:如果访问控制允许,则显示 UID 或记录的进程的 Android ID。usec
:显示精确到微秒的时间。UTC
:显示 UTC 时间。year
:将年份添加到显示的时间。zone
:将本地时区添加到显示的时间。
查看备用日志缓冲区
Android 日志记录系统为日志消息保留了多个环形缓冲区,而且并非所有的日志消息都会发送到默认的环形缓冲区。如要查看其他日志消息,您可以使用 -b
选项运行 logcat
命令,以请求查看备用的环形缓冲区。您可以查看下列任意备用缓冲区:
radio
:查看包含无线装置/电话相关消息的缓冲区。events
:查看已经过解译的二进制系统事件缓冲区消息。main
:查看主日志缓冲区(默认),不包含系统和崩溃日志消息。system
:查看系统日志缓冲区(默认)。crash
:查看崩溃日志缓冲区(默认)。all
:查看所有缓冲区。default
:报告main
、system
和crash
缓冲区。
以下是 -b 选项的用法:
[adb] logcat [-b <buffer>]
以下示例显示了如何查看包含无线装置和电话相关消息的日志缓冲区。
adb logcat -b radio
此外,也可以为要输出的所有缓冲区指定多个 -b
标记,如下所示:
logcat -b main -b radio -b events
可以指定一个 -b
标记,后跟缓冲区逗号分隔列表,例如:
logcat -b main,radio,events
通过代码记录日志
通过 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
Android日志[进阶篇]三-Logcat 命令行工具相关推荐
- Android日志[进阶篇]一-使用 Logcat 写入和查看日志
Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...
- Android日志[进阶篇]五-阅读错误报告
Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...
- Android日志[进阶篇]四-获取错误报告
Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...
- Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)
Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Androi ...
- 【Android NDK 开发】NDK C/C++ 代码崩溃调试 - Tombstone 报错信息日志文件分析 ( 使用 addr2line 命令行工具查找动态库中的报错代码位置 )
文章目录 一.从 Tombstone 报错日志中查找报错动态库 二.addr2line 命令行工具使用 64 位动态库使用的 aarch64-linux-android-addr2line.exe 工 ...
- logcat命令行工具
一.logcat是什么 logcat是Android中一个命令行工具,可以用于得到程序的log信息. 1. logcat常用选项 adb logcat -help查看帮助 adb logcat常规显示 ...
- Logcat 命令行工具
Logcat 是一个命令行工具,用于转储系统消息日志,包括设备抛出错误时的堆栈轨迹,以及从您的应用中使用 Log 类写入的消息. 本页面介绍了命令行 Logcat 工具,但在 Android Stud ...
- k8s(三):命令行工具kubectl与核心技术Pod
文章目录 1. kubectl 1.1 概述 1.2 kubectl命令语法 1.3 kubectl命令举例 2. 核心技术-Pod 2.1 概述 2.2 Pod特性 2.3 拉取镜像策略 2.4 资 ...
- shell编程之进阶篇三常见命令详解
常见命令详解 接下来我们介绍一些shell脚本中经常使用的linux命令:grep.sed.awk.find grep命令详解 grep命令是我们常用的一个强大的文本搜索命令. 命令格式详解 grep ...
最新文章
- OKR这么好,企业可以都选择OKR吗?
- 最小生成树(求村落之间最小修哪几条路能使耗资最小)
- 12 - java 类加载内存图
- 零基础入门Python:基本命令、函数、数据结构
- sass玩转颜色总结笔记
- 《无线网络技术教程第二版》阅读笔记(一)
- 每天学一点flash(67) 上传图片
- 图论--最小生成树总结(PrimKruskal)
- 49个Python学习资源:从初学者到高级玩家都有了
- 多列堆积柱形图怎么做_Excel2010中进行制作多列堆积图的操作方法|多列堆积柱状图...
- 高等数学总结(无穷级数)
- 天梯赛 L1_001-L1_020 集合
- CSAPP Bomb Lab
- BIM家装族库丨艺术家具族
- [ACTF2020 新生赛]Exec1命令注入
- python报错ValueError: Must pass 2-d input. shape=(5, 1, 10)解决方案
- icode五级训练场函数入门1-9
- android 判断文件是否存在
- 计算机动漫与游戏制作与影视,中职中专计算机动漫与游戏制作专业系列教材·动画与影视后期制作:After Effects CS4技能应用教程...
- Memcached服务应用实践
热门文章
- python 散点图 分类_Python | 分类图
- strtoupper 小写_PHP strtoupper()函数与示例
- stl resize函数_vector :: resize()函数以及C ++ STL中的示例
- 轮询锁使用时遇到的问题与解决方案!
- 坑爹的 Lombok,把我害惨了!
- jenkins用ssh agent插件在pipeline里实现scp和远程执行命令
- linux常用特殊符号
- java代码修改触发编译_gcc -O0仍然优化了“未使用”的代码 . 是否有一个编译标志来改变它?...
- 科大奥锐实验报告霍尔效应_中科大929半导体物理专业课高分学长考研经验
- vue修改计算属性的值_「Vue学习记录五」计算属性和侦听器