Android日志过滤器中正则表达式的应用

2021-06-28 12:24赵书慧
电子测试 2021年2期
关键词:字符串对话框字符

赵书慧

(辽宁石化职业技术学院,辽宁锦州,121001)

0 引言

Android Studio应用程序调试过程中,打印出来的日志里边有很多不明不白的信息,影响我们查看日志的效率。能正确的定位错误和找到自己需要的日志信息是一件很幸福的事,要想办法把不需要的日志给屏蔽掉,Logcat Filter能够完美胜任这个功能。在日志过滤器中运用正则表达式可以保留自己想要的日志信息或过滤掉无用的日志信息,使用转义字符或特殊字符序列来描述具有特定含义的过滤条件。

1 Android studio中的正则表达式

正则表达式(通常缩写成“regex”)是一种可用于字符串模式匹配和字符串替换的强有力的工具。如果我们要查找的字符串是具体而完整的, 则直接用这个字符串进行查找即可。但一般情况下,我们对要查找的内容只有一个模糊的印象,模糊查找则要使用正则表达式。在Android中“*”号并不会匹配任意字符,“.”号才匹配任意字符一次, Android studio的正则表达式和shell中的正则表达式是一致的,常用重点符号有:

(1).*表示匹配任意字符>=0次,

(2).?匹配任意字符0次或1次,

(3).+匹配任意字符1次或多次,

(4) 用$标识匹配的结束,用^表示匹配的开始,

(5) 用 | 表示匹配关系的或,当不同的log没有相同的过滤条件,又想一次性过滤出来,| 可以多次使用。

2 Android日志过滤器的使用方法

Logcat是学习Android过程中的一个重要的调试工具,用来获取系统日志信息的。日志工具类Log提供了5个方法供用户打印日志,按照级别从低到高排列如下:

Log.v()对应级别verbose,用来记录详细信息,打印所有的意义最小的日志信息。

Log.d()对应级别debug,用来记录调试信息。

Log.i()对应级别info,记录通告信息的,用于打印一些比较重要的信息,程序中常用的是调试和通告这两种方法,可以帮助用户分析行为的数据。

Log.w()对应级别warn,记录警告信息的,提示程序在这个地方可能会有潜在的风险。

Log.e()对应级别error,记录错误信息的,通常代表程序出现了严重问题,必须尽快修复。

可以在Logcat中的“日志级别”下拉列表中进行级别选择,默认级别是最小的级别信息Verbose,如图1所示。级别高于所选类型的信息也会在Logcat中显示出来,级别低于所选类型的信息则不会被显示,所以只是用日志级别过滤的信息是有限的。

图1 Logcat

上面的5个方法每个方法会有不同的重载,但通常情况下有两个参数,第一个参数是日志标签TAG(可以是一个字符串,也可以定义一个常量用来标记),主要用于对日志信息进行过滤;第二个参数是实际的信息内容msg,这两个参数都是字符串类型的数据。程序运行到我们设置的“日志点”时,在Logcat中查找相应位置的日志信息时,就可以根据“日志点”显示的信息是否存在,或与我们预期在方法中设置的信息的内容是否一致来判断程序运行到该位置之前是否存在错误,迅速找到错误的“出事地点”。

运行Android程序的时候,即使事先选择了某个日志信息的级别,产生的日志信息还是很多。这时就要用到Logcat提供的“过滤”功能了,单击图1右上角“日志过滤器”下拉列表框,选择Edit Filter Configuration打开Creat New Logcat Filter对话框(如图2)添加、删除、编辑日志过滤器。可以根据日志信息的标签(Tag)、信息的内容(Message)、日志包名、产生日志的进程编号(PID)或者信息等级(Level),对显示的日志内容进行过滤。单击对话框左上角的“+”号,添加一个名为data的过滤器,过滤条件设置为AAA,打印出来的日志就只有标签为“AAA”的有限几条了。根据自己应用程序的包名在Logcat里边自己创建一个过滤器,这样不管系统是否给你创建过滤器,都能打印出和自己应用相关的日志。

图2 创建新的日志过滤器对话框

3 日志过滤器中使用正则表达式

打印的Log有两部分,一是Tag,二是Message。由于Message一般是不固定的,所以还是愉快地用Tag作例子来过滤无关的Log吧。假设我们要保留的Tag是“AAA”,那么在Create New Logcat Filter对话框中,Log Tag栏输入“AAA"即可。如果是保留多个呢?假设除了标签“AAA”,还要保留标签“BBB”, 这个时候就要用到正则表达式了,只需要在图2中勾选Log Tag栏位后面的Regex复选框,过滤器的Log Tag位置更改为“AAA|BBB”即可,这是使用正则表达式中最简单的“或”关系。也可以输入“(A|B){3,}”,其中{3,}表示匹配前面字符的次数最少是3次。

(1)只保留特定的log

若想知道每条日志的Tag是什么,观察一下打印出来的日志:

2020-08-22 10:02:44.171 26112-26112/com.example.logtest I/AAA: onStart

对应格式如下:

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

所以只要看到日志,就能根据位置知道该日志的Tag和Message。这里,PID 代表进程标识符;TID 则为线程标识符,如果仅有一个线程,两者可以相同;package是包名;tag是日志标签;message是日志信息内容。过滤出指定Tag的日志信息,其正则表达式可以写成:^(?:tag1|tag2|tag3)

(2)忽略特定的log

在Log Tag中输入正则表达式:^(?!.*(AAA)).*$

用^表示匹配的开始,用$标识匹配的结束,!表示否定,其中AAA是要忽略掉的Tag,表示除了标签AAA之外的日志信息全部要显示。例如: 忽略指定tag的日志信息可以写成:^(?!tag1|tag2|tag3)

(3)除了可以在日志过滤器中使用正则表达式对特定的log进行过滤或忽略,也可以在图1中的“关键字过滤”文本搜索框中直接输入字符串或正则表达式,但关键字过滤时不区分Tag和Message。

4 结束语

程序开发过程中出现错误是不可避免的,录入程序时开发环境即时可以检测语法错误,并及时提示我们错误的位置以及修改的方法,但是逻辑错误的定位和分析是一件非常困难的事情。当程序打印出成百上千行日志的时候,就会迫切的需要日志过滤器了。Android应用程序中会包含很多的类名,通常会为每个类名设置一个常量TAG,根据TAG用日志过滤器筛选出自己想要看到的日志内容。如果要打印多个类的日志内容就要使用正则表达式,在日志过滤器中使用正则表达式可以让用户通过使用特定字符构建查询模式,其所提供的强大的模式匹配功能大大简化了日志筛选工作。当然,也只有通过不断地实际使用的过程,反复运用和精通正则表达式的所有特殊字符,才能真正体会到运用正则表达式在日志过滤中的优越性,为程序的调试提供强有力的支持。

猜你喜欢
字符串对话框字符
基于文本挖掘的语词典研究
正常恢复虚拟机
字符代表几
一种USB接口字符液晶控制器设计
HBM电子称与西门子S7-200系列PLC自由口通讯
Bootlace Worms’Secret etc.
What Is Beauty?
消失的殖民村庄和神秘字符
浅谈VB的通用对话框《CommonDialog》控件的使用
一种新的基于对称性的字符串相似性处理算法