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(用于存储崩溃日志)。每个日志条目都包含一个优先级(VERBOSEDEBUGINFOWARNINGERRORFATAL)、一个标识日志来源的标记以及实际的日志消息。

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

运行 adb logcat 显示的日志要经过四个级别的过滤:

  1. 编译时过滤:根据编译设置,某些日志可能会从二进制文件中完全移除。例如,可以将 ProGuard 配置为从 Java 代码中移除对 Log.d 的调用。
  2. 系统属性过滤:liblog 会查询一组系统属性以确定要发送到 logd 的最低严重级别。如果日志具有 MyApp 标记,系统会检查以下属性,并且日志应包含最低严重级别的第一个字母(VDIWES 以停用所有日志):
    • log.tag.MyApp
    • persist.log.tag.MyApp
    • log.tag
    • persist.log.tag
  3. 应用过滤:如果未设置任何属性,liblog 会使用 __android_log_set_minimum_priority 设置的最低优先级。默认设置为 INFO
  4. 显示过滤: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>加载可供查看的备用日志缓冲区,例如 eventsradio。默认使用 mainsystemcrash 缓冲区集。请参阅查看备用日志缓冲区。
-c, --clear清除(清空)所选的缓冲区并退出。默认缓冲区集为 mainsystemcrash。如需清除所有缓冲区,请使用 -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> 设置日志环形缓冲区的大小。可以在结尾处添加 KM,以指示单位为千字节或兆字节。
-p, --prune 输出(读取)当前的允许 (white) 列表和拒绝 (black) 列表,不采用任何参数,如下所示: adb logcat -p
-P '<list> ...'
--prune '<list> ...' -P '<white_and_black_list>'
写入(设置)允许 (white) 列表和拒绝 (black) 列表以出于特定目的调整日志记录内容。您可以提供允许 (<white>) 列表和拒绝 (~<black>) 列表条目的混合内容,其中 <white><black> 可以是 UID、UID/PID 或 /PID。在 logcat 统计信息 (logcat -S) 的指导下,您可以考虑出于各种目的调整允许 (white) 列表和拒绝 (black) 列表,例如:
  • 通过 UID 选择使特定日志记录内容具有最长保留期限。
  • 阻止人 (UID) 或物 (PID) 消耗相应资源,以帮助增加日志跨度,从而更深入地了解正在诊断的问题。

默认情况下,日志记录系统会自动以动态方式阻止日志统计信息中最严重的违规内容,以便为新的日志消息腾出空间。一旦它用尽启发法,系统便会删除最旧的条目,以便为新消息腾出空间。

添加许可名单 (whitelist) 可保护您的 Android 识别码 (AID),它会变成进程的 AID 和 GID,而不会被声明为违规内容;添加拒绝列表有助于在相应内容被视为最严重的违规内容之前即释放空间。您可以选择删除内容的程度和频率;也可以关闭删除功能,这样,系统便仅会移除各个日志缓冲区中最旧条目的内容。

引号

adb logcat 不会保留引号,因此指定允许 (white) 列表和拒绝 (black) 列表的语法如下所示:

$ adb logcat -P '"<white_and_blacklist>"' or adb shell $ logcat -P '<white_and_blacklist>'

以下示例指定了一个包含 PID 32676 和 UID 675 的允许 (white) 列表,以及一个包含 PID 32677 和 UID 897 的拒绝 (black) 列表。拒绝列表中的 PID 32677 经过加权处理,以便可以更快删除。

adb logcat -P '"/32676 675 ~/32677 897"'

其他您可以使用的允许 (white) 列表和拒绝 (black) 列表命令变体如下所示:

~! 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 日志消息都有一个与之相关联的标记和优先级。可以将任何格式修饰符与以下任一格式选项进行组合:brieflongprocessrawtagthreadthreadtimetime

可以通过在命令行中输入 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:报告 mainsystemcrash 缓冲区。

以下是 -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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python while语法结构_python语法之流程控制(if while for)

一.python语法之流程控制1.1什么是流程控制&#xff1f;流程控制即控制流程&#xff0c;具体指控制程序的执行流程&#xff0c;而程序的执行流程分为三种结构&#xff1a;顺序结构(之前我们写的代码都是顺序结构)、分支结构(判断)、循环结构(while for)二.分支结构2.1 什么是分…

Android日志[进阶篇]四-获取错误报告

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录前言从设备上获取错误报告从 Android 模拟器上…

下列哪个适合做链栈_朋友圈人格图鉴:三天可见 vs 全部可见,哪个更适合做恋人?...

你们的朋友圈里有没有这样几种人&#xff1f;<< 朋友圈大赏 >>你可能已经对这些朋友圈的风格习以为常&#xff0c;其实&#xff0c;每个人在朋友圈展示的语言、行为&#xff0c;可能默默揭示着一个人自己原本是怎样的人、想成为什么样的人&#xff0c;以及与他人的…

python玫瑰花数量的含义_玫瑰花数量代表的含义

1朵玫瑰代表——我的心中只有你 ONLY YOU&#xff01;2朵玫瑰代表——这世界只有我俩&#xff01;3朵玫瑰代表——我爱你 I LOVE YOU&#xff01;4朵玫瑰代表——至死不渝&#xff01;5朵玫瑰代表——由衷欣赏&#xff01;6朵玫瑰代表——互敬 互爱 互谅&#xff01;7朵玫瑰代表…

Android日志[进阶篇]五-阅读错误报告

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录Logcat查看事件日志ANR 和死锁找出无响应的应用…

iatf16949内审员_申请IATF16949认证有什么要求

1、证件要求必须要提供三证合一的营业执照&#xff08;在有效期内&#xff09;&#xff0c;营业执照的范围必须与申请IATF16949认证范围一致。2、处于汽车供应链的证明因为IATF16949认证要求厂家必须是直接与生产汽车有关的&#xff0c;具有加工制造能力&#xff0c;并通过这种…

GenseeSDK DocView(OpenGL)引起的TextView显示黑块

现象 先上图&#xff1a; 正常的图&#xff1a; 来到这的大侠是否也出现了同样的问题。 操作与描述 退出直播播放器后&#xff0c;整个app界面所有的TextView(EditText/Button)都显示为黑块。 快速解决 退出直播或点播后不要调用DocView的closeDoc函数即可&#xff0c;当…

python医疗发票 信息抽取_PYTHON网络爬虫与信息提取[信息的组织与提取](单元五)...

1 三种信息类型的简介xml : extensible markup language与html非常相似现有html后有xmlxml是html发展来的 扩展 通用json 类型javascript object notation有类型的键值对 表达的方式一个key对应多个值"key1":["asas",asas]嵌套使用"name":{&quo…

Android WebView https白屏、Http和Https混合问题、证书配置和使用

目录前言启用https后白屏&#xff08;证书错误&#xff09;修改处理WebView中Http和Https混合问题处理办法Webview的几种内容加载模式证书配置或处理https请求的证书okhttp进行请求&#xff1a;HttpsURLConnection忽略证书前言 原有项目中有部分界面是用webview展现的h5页面&am…

Kotlin AAPT: error: resource android:attr/lStar not found.

这是使用kotlin之后发生的错误。 打开 android/app 工程全局搜索androidx.core:core-ktx: 全局搜索快捷键 ctrlshift f将搜索到的内容修改为androidx.core:core-ktx:1.6.0 也就是说将androidx.core:core-ktx: 修改为androidx.core:core-ktx:1.6.0,一般情况下是在module的中的b…

python selenium iframe怎么定位_python+selenium四:iframe查看、定位、切换

iframe是HTML里面嵌套HTML的一种框架1.查看iframe1.Top Window&#xff1a;可直接定位2.iframe#i&#xff1a;说明此元素在iframe上3.iframe显示为空&#xff1a;(id或name为空)4.右边这个看到是空的(2层iframe)以126邮箱为例from selenium import webdriverdriver webdriver.…

Kotlin plugin should be enabled before ‘kotlin-android-extensions‘

问题一 、Kotlin plugin should be enabled before ‘kotlin-android-extensions‘ 在java项目中添加kotlin的类之后&#xff0c;根据提示进行各种配置和下载&#xff0c;一顿操作后出现了Kotlin plugin should be enabled before kotlin-android-extensions’ 处理办法&…

python增加工作日列_将工作日添加到日期字段

我试图在Django的日期字段中添加一些工作日。这是针对产品订购&#xff0c;我们对不同的产品有不同的交付周期&#xff0c;我们希望为每个产品生成一个目标日期。在例如&#xff0c;产品X可能需要10个工作日才能交付&#xff0c;如果此产品是在2013年3月1日星期五订购的&#x…

tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化

基于TensorRT车辆实时推理优化Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles自动驾驶系统使用各种神经网络模型&#xff0c;这些模型要求在GPU上进行极其精确和高效的计算。Zoox是一家全新开发robotaxis的初创公司&#xff0c;充分利…

问卷调查试卷的数据设计

目录前言数据定义数据说明1、第一层{}2、question 一个题目{}3、answer一个答题回复{}4、option 一个选项{}5、selectItems {}具体数据1、发题&#xff08;终端请求&#xff09;示例2、答题(图片答题&#xff0c;终端请求)互动或静态3、停止答题(终端请求&#xff0c;一般是互动…

手机上网流量统计_数据统计 | 上半年手机流量同比增110.2%,你贡献了多少?

来源&#xff1a;工信部网站、中新经纬版权申明&#xff1a;内容来源网络&#xff0c;版权归原创者所有。除非无法确认&#xff0c;我们都会标明作者及出处&#xff0c;如有侵权烦请告知我们&#xff0c;我们会立即删除并表示歉意。谢谢&#xff01;7月25日&#xff0c;工信部网…

Kotlin静态方法定义和调用

在习惯java的开发之后&#xff0c;使用kotlin进行编码&#xff0c;总有那么些不自然。 静态类的定义&#xff1a; 全局静态(实际上是单例模型) 直接将类声明为object&#xff0c;那么所有的函数也就静态的了&#xff0c;这种一般适用于各种util的类。 object UIUtil {fun to…

mybatis insert插入成功返回0_mybatis添加客户

在MyBatis的映射文件中&#xff0c;添加操作是通过元素来实现的。例如&#xff0c;向数据库中的t_customer表中插入一条数据可以通过如下配置来实现。在上述配置代码中&#xff0c;传入的参数是一个Customer类型&#xff0c;该类型的参数对象被传递到语句中时&#xff0c;#{use…

Andoid TextView显示富文本html内容及问题处理

目录富文本内容与效果TextView HtmlImageGetter 处理图片(表情)TagHandler 处理html内容的节点Html的转换过程HtmlToSpannedConverterhandleStartTagstartCssStyle(mSpannableStringBuilder, attributes)字体无效果实现getForegroundColorPattern颜色不显示的坑处理办法颜色修…

mysql截取字符串最后两位_MySQL字符串函数substring:字符串截取

MySQL 字符串截取函数&#xff1a;left(), right(), substring(), substring_index()。还有 mid(), substr()。其中&#xff0c;mid(), substr() 等价于 substring() 函数&#xff0c;substring() 的功能非常强大和灵活。1. 字符串截取&#xff1a;left(str, length)mysql> …