Android Log-日志介绍

一、基本介绍

  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日志

猜你喜欢

转载自blog.csdn.net/weixin_56291477/article/details/124905231