Android Log-日志介绍

2023-11-19

一、基本介绍

  Logcat是Android日常开发过程中的重要组成部分。Logcat上会显示系统消息、使用Log类添加到应用的消息、应用运行异常信息等,通过日志,我们可以实时监控应用运行状态,为应用调试提供重要参考。

Log格式

一条标准的日志由以下几个部分组成:

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

例子:
2022-05-15 21:55:00.461 1224-4993/com.google.android.gms W/GCM: GCM FAILED TO INITIALIZE - missing checkin
  • date:日志输出时设备的日期。
  • time:日志输出时设备的时间,精确到毫秒。
  • PID:进程标识符。
  • TID:线程标识符,若进程中只存在一个线程,则PID与TID可以相同。
  • package:输出该条日志的应用包名。
  • priority:日志优先级,取值如下,优先级从低到高排列:

V:详细(优先级最低)
D:调试
I:信息
W:警告
E:错误
A:断言

  • tag:标签,用来标明日志发起者以及方便对日志进行过滤筛选。
  • message:日志的主体内容。

二、Log类介绍

  android.util.Log是Android上用于发送日志输出的API。 Log类按照日志优先级,提供了以下最常用的5种方法:

(1)static int v(String tag, String msg)

该方法用于打印最为琐碎的、意义最小的日志信息,是Android日志级别最低的一种,其对应级别为:verbose。

(2)static int d(String tag, String msg)

该方法用于打印调试信息,可以在Release版本中关闭,比较常见,开发中经常选择输出此种级别的日志,有时在beta版应用中出现。对应级别为:debug。

(3)static int i(String tag, String msg)

该方法用于打印一些比较重要的数据,对应级别:info。该等级日志显示运行状态信息,可在产品出现问题时提供帮助,从该级别开始的日志通常包含完整意义的英语语句和调试信息,是最常见的日志级别。

(4)static int w(String tag, String msg)

该方法用于打印一些警告信息,表示运行出现异常即将发生错误或表明已发生非致命性错误,对应级别:warn。该级别日志通常显示出执行过程中的意外情况,例如将try-catch语句块中的异常打印堆栈轨迹之后可输出此种级别日志。

(5)static int e(String tag, String msg)

该方法用于打印程序中的错误信息,表示已经出现可影响运行的错误,比如应用crash时输出的日志,对应级别:error。

注:以上5种方法均存在一个重载方法,可用于输出异常信息及其堆栈轨迹。

static int v (String tag, String msg, Throwable tr);
static int d (String tag, String msg, Throwable tr);
static int i (String tag, String msg, Throwable tr);
static int w (String tag, String msg, Throwable tr);
static int e (String tag, String msg, Throwable tr);
(6)static String getStackTraceString(Throwable tr)

该方法可从Throwable获取到异常信息及其堆栈轨迹。

(7)static boolean isLoggable (String tag, int level)

该方法用于检查指定标签的日志是否能够在指定优先级进行输出。在Android系统上,任何标签的允许输出的默认优先级都是INFO,我们可以通过设置系统prop来控制指定标签允许输出的优先级,来控制isLoggable方法的返回结果,则我们可以通过该方法来控制指定日志的开关。

(8)static int wtf (String tag, String msg)

该方法用于报告一个永远不会发生的情况,“wtf"意为"what a terrible failure”,该错误将被记录在assert(中断)级别的log打印中,并可以根据系统配置发送错误报告,并立即终止程序。


三、adb logcat介绍

  adb全称Android Debug Bridge,中文翻译安卓调试桥。adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备。它的主要功能有:

  • 运行设备的shell(命令行)。
  • 管理模拟器或设备的端口映射。
  • 计算机和设备之间上传/下载文件。
  • 将本地apk软件安装至模拟器或android设备。

通过ADB命令,我们可以获取到Android设备上生成的日志信息,主要有以下几个命令:

1、adb shell dumpstate

查看手机系统当前状态信息(包含系统构建版本、网络相关、内存的使用、cpu的使用、进程等信息),需要root权限。

2、adb shell bugreport

输出过去系统的状态,log,会打印出dmesg,dumpstate和dumpsys的输出。

3、adb shell dmesg

打印内核kernel的信息及日志,需要root权限。

4、adb shell dumpsys

获取并打印获取系统各项服务信息,可以在命令后面加指定的service name(比如activity,location),如果不加则默认打印出设备中所有service的信息。

5、adb logcat / adb shell logcat

输出当前缓冲区日志。

注:android系统把log输出到不一样的缓冲区中,目前定义了四个log缓冲区:

  • radio:输出通讯系统(无线/电话相关)的log。
  • system:输出系统组件的log。
  • events:输出事件相关模块的log。
  • main:全部java层的log, 也是主缓冲区 (默认缓冲区)。

缓冲区主要给系统组件使用,上层应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的状况下)是输出System和Main缓冲区的log。

以下重点说明adb logcat命令:

(1)命令格式

adb logcat [选项] [过滤项]

注:[]中的内容表示是可选的,所以选项和过滤项是可选的。

(2)常用选项说明
参数 描述
-b <buffer> 加载一个可使用的日志缓冲区供查看,比如event和radio。默认值是main
-g 打印日志缓冲区的大小并退出
-c 清除缓冲区中的全部日志并退出(清除完后可以使用-g查看缓冲区)
-d 将缓冲区的log转存到屏幕中然后退出, 不阻塞
-t <count> 输出最近的count行日志, 输出完退出, 不阻塞
-B 以二进制形式输出日志内容
-s 设置输出日志的标签, 只显示该标签的日志
-f <filename> 将log输出到指定的文件中,默认为标准输出(stdout)
-r <kbytes> 按照每千字节输出日志,默认值是16,需要和-f选项一起使用
-n <count> 设置日志输出的最大数目,默认值是4,需要和-r选项一起使用
-v <format> 设置日志的输出格式,注意只能设置一项

关于 adb logcat选项中-r -n -f的使用说明

adb logcat -f /mnt/sdcard/log/test.log -r 20 -n 6

以上述命令进行举例说明:

  • "-f /mnt/sdcard/log/test.log"表明了将log都输出到/mnt/sdcard/log/test.log文件中。
  • "-r 20"表明了日志文件大小最大不超过20kb,测试时发现产生的日志文件大小最大都会略大于20kb,但不超过21kb。
  • “-n 6"表明日志写入文件时,最多能产生的完整日志文件(其文件大小由”-r"决定)个数为6个,加上正在写入的日志文件,则一共存在7个日志文件。其中,正在写入的日志文件名称为test.log(与"-f"选项指定的文件名一致),而完整的日志文件名称则会多了一个数字后缀,命名为test.log.1,从1开始,直到6为止,后缀数字越小,表明日志文件中的内容越新,即test.log日志内容最新,test.log.1次之,test.log.6日志内容最久远。
  • 当已经生成test.log.1、test.log.2、…test.log.6文件,且test.log已写入超过20kb内容后,则会将test.log.6删除,并依次将其他日志文件的后缀加1,然后将test.log命名为test.log.1,然后再创建一个新的test.log文件进行日志写入。

在这里插入图片描述

关于 -v <format> 的使用说明

以下对常用的<format>格式类型进行简单说明:

  • brief:这个是默认格式,输出日志格式为<priority>/<tag>(<pid>): <message>。

D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0

  • process:输出日志格式为<priority>(<pid>) <message>。

D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine)

  • tag:输出日志格式为<priority>/<tag>: <message>。

D/HeadsetStateMachine: Disconnected process message: 10, size: 0

  • raw:输出日志格式为<message>。

Disconnected process message: 10, size: 0

  • time:输出日志格式为<datetime> <priority>/<tag>(<pid>): <message>。

08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0

  • threadtime:输出日志格式为<datetime> <pid> <tid> <priority> <tag>: <message>。

08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0

  • long:输出日志格式为[ <datetime> <pid>:<tid> <priority>/<tag> ]。

[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0

(3)过滤项

通过使用过滤项字段,我们可以限定打印指定标签的指定优先级及以上的日志。

过滤语法:tag:priority
其中,tag为标签,priority为优先级。
可以只使用标签,而不加优先级,则会打印指定标签所有优先级的log。
优先级使用字符标识,以下优先级从低到高排列:

  • V –Verbose(最低优先级)
  • D – Debug
  • I – Info
  • W – Warning
  • E – Error
  • F – Fatal
  • S – Silent(最高优先级,基本无日志)

举例如下:

//打印:  
//(1)标签为ActivityManager,且优先级大于等于I的日志;  
//(2)标签为MyApp,且优先级大于等于D的日志;  
//(3)任意标签,优先级大于等于S的日志,主要是用于屏蔽其他TAG的日志。这是由于tag:priority不会影响其他标签的日志输出,只会影响指定tag输出的日志。  
//若没有加上 *:S 这一句,则会按要求输出标签为ActivityManager和MyApp的指定等级日志,以及其他标签的任意级别日志。   
adb logcat ActivityManager:I  MyApp:D *:S

四、Android studio logcat介绍

1、打开Logcat
  • 通过单击Android Studio底部的Logcat工具栏按钮。

在这里插入图片描述

  • 通过单击主菜单栏View > Tool Windows > Logcat。

在这里插入图片描述

2、Logcat窗口左边栏说明

在这里插入图片描述

在这里插入图片描述

3、Logcat窗口上边栏说明
  • 设备选择菜单,可以从下拉菜单中选择要查看日志的设备。

在这里插入图片描述

  • 应用程序(进程)选择菜单,可以从中选择指定应用包名,来查看对应程序的日志。

在这里插入图片描述

  • 日志优先级过滤项,选择显示指定优先级以及更高级别的日志。

在这里插入图片描述

  • 字符串搜索框,在其中输入字符串,就能根据该字符串进行日志过滤,输出包含对应字符串的日志。

在这里插入图片描述

  • (可选)如果在搜索字符串时,想要使用正则表达式搜索模式,请选中Regex。

在这里插入图片描述

  • 过滤器菜单。
  • Show only selected application:仅显示通过应用代码生成的消息(默认选项)。Logcat 使用正在运行的应用的 PID 来过滤日志消息。
  • Firebase:谷歌提供的一个分析工具。
  • No Filters:不应用过滤器。无论选择哪个进程,logcat都会显示设备中的所有日志消息。
  • Edit Filter Configuration:创建或修改自定义过滤器。例如,可以自定义创建一个过滤器,以同时查看两个应用中的日志消息。

在这里插入图片描述

4、自定义过滤器

在这里插入图片描述

  • Filter Name:输入要设定的过滤器的名称,或者从左侧窗格中进行选择以修改现有过滤器。
  • Log Tag:(可选)打印指定标签的日志,若为空,则表示打印任意标签的日志。
  • Log Message:(可选)打印日志文本内容包含指定字符串的日志,若为空,则表示打印任意内容的日志。
  • Package Name:(可选)指定要打印日志的软件包名,若为空,则表示打印任意程序的日志。
  • PID:(可选)指定要打印日志的进程ID,若为空,则表示打印任意进程的日志。
  • Log Level:(可选)选择要打印的日志优先级别。
  • Regex:选中此选项,可以为相应参数使用正则表达式语法。

注:最后打印出来的日志为经过以上所有选项过滤后的日志。

保留多个Tag的日志

通过使用正则表达式来设置保留多个Tag日志,例如目前需要打印Tag为AAA和BBB的日志,则需要勾选Log Tag后的Regex选项,然后在Tag那一栏填入 AAA|BBB 即可。

过滤特定Tag的log

例如目前需要过滤掉Tag为AAA和BBB的日志,则需要勾选Log Tag后的Regex选项,然后在Tag那一栏填入 ^(?!.*(AAA|BBB)).*$ 即可。

注:对于其他选项(Message、Package Name等)也可以进行类似上面的处理。


附录

  1. 浅谈Android的日志机制:Log和logcat
  2. 使用 Logcat 写入和查看日志
  3. Android Studio中Logcat写入和查看日志
  4. Android logcat命令详解
  5. 浅谈Android的日志机制:Log和logcat
  6. 使用adb logcat命令显示Android设备上的Log日志
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Log-日志介绍 的相关文章

  • Android 通知进度条冻结

    这是我正在使用的代码 http pastebin com 3bMCKURu http pastebin com 3bMCKURu 问题是 一段时间后 文件变得更重 通知栏下拉速度变慢 最后它就冻结了 你的通知太频繁了 这就是它冻结的原因 让
  • getItem 与 getItemAtPosition

    有两种方法可以获取列表视图中的选定项目 list getAdapter getItem position list getItemAtPosition position 我的问题是 哪一种是首选的做法 我见过人们同时使用这两种方法 您可以使
  • 与 Admob 广告单元 ID 混淆

    我跟着tutorial https developers google com admob android quick start在我的应用程序中创建广告横幅 到目前为止 这有效 我可以看到测试广告 但是 本教程指示我在两个不同的位置使用两
  • Firebase Analytics 禁用受众国家/地区跟踪

    我正在开发一个严格不允许位置跟踪的应用程序 我想使用 Firebase Analytic 的其他功能 例如 PageTransitions 和 Crashalitics 但如果我无法禁用受众位置跟踪 我就无法使用其中任何功能 这是我在 An
  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • 接近语法错误(代码1)插入Android SQLite

    我正在创建一个通讯录应用程序 用户可以在其中输入姓名 电子邮件地址和号码 我希望将此数据保存在数据库中 但我似乎无法使插入方法起作用 我收到的错误是 android database sqlite SQLiteException near
  • 设置从 Facebook 登录获取用户电子邮件 ID 的权限

    我在用着Facebook 3 0 SDK对于安卓 我必须实施Facebook登录 我正在访问用户的基本信息 例如姓名 用户 ID 但我也想访问用户的电子邮件 我浏览了很多博客和论坛 但不知道该怎么做 我正在使用我自己的 android 按钮
  • 如果我们使用后退按钮退出,为什么 Android 应用程序会重新启动?

    按住主页按钮并返回应用程序时 应用程序不会重新启动 为什么使用后退按钮会重新启动 如果我们使用后退按钮退出 有什么方法可以解决在不重新启动的情况下获取应用程序的问题吗 请帮忙 当您按下Home按钮 应用程序将暂停并保存当前状态 最后应用程序
  • 在 Google Analytics 中跟踪应用程序版本

    我正在使用谷歌分析模块 https marketplace appcelerator com apps 5081 2014113336 https marketplace appcelerator com apps 5081 2014113
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • Firebase:如何在Android应用程序中设置默认通知渠道?

    如何设置default通知渠道通知消息当应用程序在后台运行时会出现什么情况 默认情况下 这些消息使用 杂项 通道 如你看到的在官方文档中 https firebase google com docs cloud messaging andr
  • 如何在不更改手机语言的情况下更改Android应用程序语言?

    我希望用户在应用程序内选择一种语言 选择语言后 我希望字符串使用特定语言 如果我更改手机语言 那么我的应用程序将以设置的语言运行 我无法找到任何在不更改手机语言的情况下设置语言的方法 此外 一旦设置了语言 更改就应该反映出来 有人可以建议一
  • 材质设计图标颜色

    应该是哪种颜色 暗 材质图标 在官方文档上 https www google com design spec style icons html icons system icons https www google com design s
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Android 如何聚焦当前位置

    您好 我有一个 Android 应用程序 可以在谷歌地图上找到您的位置 但是当我启动该应用程序时 它从非洲开始 而不是在我当前的城市 国家 位置等 我已经在developer android com上检查了信息与位置问题有关 但问题仍然存在
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 为什么Android的ImageReader类这么慢?

    我尝试了适用于 Android 3 4 1 的全新 OpenCVJavaCamera2View但它太慢了 仅显示相机视图约 15 fps 当我尝试较旧的JavaCameraView相反 它给了我很好的结果 30fps 这是我相机的极限 我想
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框
  • 找到 Android 浏览器中使用的 webkit 版本?

    有没有办法知道某些特定手机上的 Android 浏览器使用的是哪个版本的 webkit 软件 如果有一个您可以浏览以获取该信息的 URL 那就太好了 但任何其他方式也很好 如果你知道 webkit 版本 你就知道 html5 支持多少 至少

随机推荐

  • AbstractQueuedSynchronizer之AQS

    文章目录 AbstractQueuedSynchronizer AQS 概述 基本原理 实现细节 等待队列 state属性 独占模式 ReentrantLock AbstractQueuedSynchronizer AQS 概述 Abstr
  • 爬虫学习笔记(十五)——加密解密

    文章目录 一 概念和作用 1 1 概念 1 2 作用 1 3 常用加密方式 二 字符编码 2 1 进制间转换方法 python 2 2 unicode 三 Base64编码原理 3 1 概念 3 2 作用 3 3 Base64编码表 3 4
  • MySQL备份与恢复

    2 3 1备份MySQL数据库 在MySQL的bin目录下 有一个名为mysqldump的可执行文件 将该bin目录添加到环境变量中 可以利用它在 命令提示符 环境下来备份数据库 语法格式如下 mysqldump opt 要备份的数据库名
  • 词项(term)与词条(token)区别

    传送门
  • Sublime Text 3 全程详细图文教程(转载)

    今天被群里大佬安利了一款文本编辑软件 找了一下相关教程 一 前言 使用Sublime Text 也有几个年头了 版本也从2升级到3了 但犹如寒天饮冰水 冷暖尽自知 最初也是不知道从何下手 满世界地查找资料 但能查阅到的资料 苦于它们的零碎
  • 系统CPU飙高和频繁GC,我要怎么排查

    1 Full GC次数过多 相对来说 这种情况是最容易出现的 尤其是新功能上线时 对于Full GC较多的情况 其主要有如下两个特征 线上多个线程的CPU都超过了100 通过jstack命令可以看到这些线程主要是垃圾回收线程 通过jstat
  • 理解图像的傅里叶变换(细心分析)

    最近在看图像的傅里叶变换 看着频谱图一直没看明白到底为啥是那样的 跟同学研究了好久 终于想明白了 感谢同学的耐心指导 大家相互讨论真的很快就能出结果 多讨论 多学习 图像的傅里叶变换 图像是一个二维的信号 所以对它进行二维的傅里叶变换 对于
  • layui文件上传接口后端具体实现SpringMVC

    做课程设计时候 用到了layui文件上传接口 参考官方文档给出的响应接口文档 code 0 msg data src http cdn layui com 123 jpg 然后具体的上传书写方式分为前端和后端 layui官方并没有说明上传的
  • [1140]linux查看历史命令history

    一 什么是history 在bash功能中 它能记忆使用过的命令 这个功能最大的好处就是可以查询曾经做过的举动 从而可以知道你的运行步骤 那么就可以追踪你曾下达过的命令 以作为除错的工具 二 History的保存 那么命令记录在哪里呢 在h
  • tomcat数据源配置多个ip oracle,tomcat里配置多数据源(数据库连接池) jndi 和项目连接 ssh框架...

    以mysql和oracle数据库为例 我项目以mysql为主 但需要去一个oracle数据库里查询数据 所以只有mysql里表的实体类 但没有oracle数据库实体类 所以配置mysql的数据源有实体类直接把数据源放到session工厂里用
  • 如何修改文件权限

    改变文件权限的两种方法 第一种 符号 sudo chmod 文件身份 操作符 权限符号 文件档案或目录 文件的四种身份 u user文件所有者 g group 文件所属群组 o other 其他拥有者 a all 全部身份 操作符的三种类
  • 4.1 不定积分的概念与性质

    思维导图 学习目标 学习不定积分 我会采取以下几个步骤 1 学习基本的积分表 首先 我会学习基本的积分公式 例如幂函数 指数函数 三角函数 反三角函数等的积分公式 这些公式是不定积分计算的基础 掌握它们是十分重要的 2 理解积分的定义和性质
  • FLOPS、TOPS和FLOPs的区别

    FLOPS 即每秒浮点运算次数 是每秒所执行的浮点运算次数 Floating point operations per second 缩写 FLOPS 的简称 被用来评估电脑效能 FLOPs 注意s小写 是floating point op
  • Android C2DM学习——云端推送

    一 基础知识 当我们开发需要和服务器交互的应用程序时 基本上都需要获取服务器端的数据 比如 地震及时通 就需要及时获取服务器上最新的地震信息 要获取服务器上不定时更新的信息一般来说有两种方法 第一种是客户端使用Pull 拉 的方式 隔一段时
  • LeetCode_Array_42. Trapping Rain Water 接雨水【双指针】【Java】【困难】

    目录 一 题目描述 英文描述 中文描述 示例与说明 二 解题思路 三 AC代码 Java 四 解题过程 第一搏 第二搏 一 题目描述 英文描述 Given n non negative integers representing an el
  • Qt在connect重载信号时使用lambda表达式

    Qt在connect重载信号时使用lambda表达式与一般信号时有所区别 例 QComboBox信号currentIndexChanged有两种参数类型 void currentIndexChanged int index void cur
  • 如何统计DataFrame中各列数据分类的各个不同数据出现的次数

    可以使用 value counts 函数来统计每个不同数据在数据列中出现的次数 例如 假设有一个名为 df 的 DataFrame 其中包含一列名为 col 要统计 col 列中各个不同数据的出现次数 可以使用以下代码 counts df
  • python 读写数据文件的6种常用方式

    本文主要介绍python读写数据文件的6种常用方式 1 python内置方法 with open r test xlsx as f a f read 一般 在应用上述上下文管理器后 可以用如下三种方式进行内置方法的读写操作 read 一次性
  • java实现区块链_用Java实现一个简单的区块链

    前面的文章 笔者花了不少的文字来介绍区块链的基础概念 以太坊的概念和开发 大家是否感觉区块链开发还是挺复杂的呢 但其实区块链技术本质就是一个分布式账本 在技术上本质就是一个链表 链表里面有一个个的区块 每个区块有自己的数字签名 涉及到加密技
  • Android Log-日志介绍

    一 基本介绍 Logcat是Android日常开发过程中的重要组成部分 Logcat上会显示系统消息 使用Log类添加到应用的消息 应用运行异常信息等 通过日志 我们可以实时监控应用运行状态 为应用调试提供重要参考 Log格式 一条标准的日