趙書(shū)慧
(遼寧石化職業(yè)技術(shù)學(xué)院,遼寧錦州,121001)
Android Studio應(yīng)用程序調(diào)試過(guò)程中,打印出來(lái)的日志里邊有很多不明不白的信息,影響我們查看日志的效率。能正確的定位錯(cuò)誤和找到自己需要的日志信息是一件很幸福的事,要想辦法把不需要的日志給屏蔽掉,Logcat Filter能夠完美勝任這個(gè)功能。在日志過(guò)濾器中運(yùn)用正則表達(dá)式可以保留自己想要的日志信息或過(guò)濾掉無(wú)用的日志信息,使用轉(zhuǎn)義字符或特殊字符序列來(lái)描述具有特定含義的過(guò)濾條件。
正則表達(dá)式(通??s寫(xiě)成“regex”)是一種可用于字符串模式匹配和字符串替換的強(qiáng)有力的工具。如果我們要查找的字符串是具體而完整的, 則直接用這個(gè)字符串進(jìn)行查找即可。但一般情況下,我們對(duì)要查找的內(nèi)容只有一個(gè)模糊的印象,模糊查找則要使用正則表達(dá)式。在Android中“*”號(hào)并不會(huì)匹配任意字符,“.”號(hào)才匹配任意字符一次, Android studio的正則表達(dá)式和shell中的正則表達(dá)式是一致的,常用重點(diǎn)符號(hào)有:
(1).*表示匹配任意字符>=0次,
(2).?匹配任意字符0次或1次,
(3).+匹配任意字符1次或多次,
(4) 用$標(biāo)識(shí)匹配的結(jié)束,用^表示匹配的開(kāi)始,
(5) 用 | 表示匹配關(guān)系的或,當(dāng)不同的log沒(méi)有相同的過(guò)濾條件,又想一次性過(guò)濾出來(lái),| 可以多次使用。
Logcat是學(xué)習(xí)Android過(guò)程中的一個(gè)重要的調(diào)試工具,用來(lái)獲取系統(tǒng)日志信息的。日志工具類(lèi)Log提供了5個(gè)方法供用戶(hù)打印日志,按照級(jí)別從低到高排列如下:
Log.v()對(duì)應(yīng)級(jí)別verbose,用來(lái)記錄詳細(xì)信息,打印所有的意義最小的日志信息。
Log.d()對(duì)應(yīng)級(jí)別debug,用來(lái)記錄調(diào)試信息。
Log.i()對(duì)應(yīng)級(jí)別info,記錄通告信息的,用于打印一些比較重要的信息,程序中常用的是調(diào)試和通告這兩種方法,可以幫助用戶(hù)分析行為的數(shù)據(jù)。
Log.w()對(duì)應(yīng)級(jí)別warn,記錄警告信息的,提示程序在這個(gè)地方可能會(huì)有潛在的風(fēng)險(xiǎn)。
Log.e()對(duì)應(yīng)級(jí)別error,記錄錯(cuò)誤信息的,通常代表程序出現(xiàn)了嚴(yán)重問(wèn)題,必須盡快修復(fù)。
可以在Logcat中的“日志級(jí)別”下拉列表中進(jìn)行級(jí)別選擇,默認(rèn)級(jí)別是最小的級(jí)別信息Verbose,如圖1所示。級(jí)別高于所選類(lèi)型的信息也會(huì)在Logcat中顯示出來(lái),級(jí)別低于所選類(lèi)型的信息則不會(huì)被顯示,所以只是用日志級(jí)別過(guò)濾的信息是有限的。
圖1 Logcat
上面的5個(gè)方法每個(gè)方法會(huì)有不同的重載,但通常情況下有兩個(gè)參數(shù),第一個(gè)參數(shù)是日志標(biāo)簽TAG(可以是一個(gè)字符串,也可以定義一個(gè)常量用來(lái)標(biāo)記),主要用于對(duì)日志信息進(jìn)行過(guò)濾;第二個(gè)參數(shù)是實(shí)際的信息內(nèi)容msg,這兩個(gè)參數(shù)都是字符串類(lèi)型的數(shù)據(jù)。程序運(yùn)行到我們?cè)O(shè)置的“日志點(diǎn)”時(shí),在Logcat中查找相應(yīng)位置的日志信息時(shí),就可以根據(jù)“日志點(diǎn)”顯示的信息是否存在,或與我們預(yù)期在方法中設(shè)置的信息的內(nèi)容是否一致來(lái)判斷程序運(yùn)行到該位置之前是否存在錯(cuò)誤,迅速找到錯(cuò)誤的“出事地點(diǎn)”。
運(yùn)行Android程序的時(shí)候,即使事先選擇了某個(gè)日志信息的級(jí)別,產(chǎn)生的日志信息還是很多。這時(shí)就要用到Logcat提供的“過(guò)濾”功能了,單擊圖1右上角“日志過(guò)濾器”下拉列表框,選擇Edit Filter Configuration打開(kāi)Creat New Logcat Filter對(duì)話(huà)框(如圖2)添加、刪除、編輯日志過(guò)濾器??梢愿鶕?jù)日志信息的標(biāo)簽(Tag)、信息的內(nèi)容(Message)、日志包名、產(chǎn)生日志的進(jìn)程編號(hào)(PID)或者信息等級(jí)(Level),對(duì)顯示的日志內(nèi)容進(jìn)行過(guò)濾。單擊對(duì)話(huà)框左上角的“+”號(hào),添加一個(gè)名為data的過(guò)濾器,過(guò)濾條件設(shè)置為AAA,打印出來(lái)的日志就只有標(biāo)簽為“AAA”的有限幾條了。根據(jù)自己應(yīng)用程序的包名在Logcat里邊自己創(chuàng)建一個(gè)過(guò)濾器,這樣不管系統(tǒng)是否給你創(chuàng)建過(guò)濾器,都能打印出和自己應(yīng)用相關(guān)的日志。
圖2 創(chuàng)建新的日志過(guò)濾器對(duì)話(huà)框
打印的Log有兩部分,一是Tag,二是Message。由于Message一般是不固定的,所以還是愉快地用Tag作例子來(lái)過(guò)濾無(wú)關(guān)的Log吧。假設(shè)我們要保留的Tag是“AAA”,那么在Create New Logcat Filter對(duì)話(huà)框中,Log Tag欄輸入“AAA"即可。如果是保留多個(gè)呢?假設(shè)除了標(biāo)簽“AAA”,還要保留標(biāo)簽“BBB”, 這個(gè)時(shí)候就要用到正則表達(dá)式了,只需要在圖2中勾選Log Tag欄位后面的Regex復(fù)選框,過(guò)濾器的Log Tag位置更改為“AAA|BBB”即可,這是使用正則表達(dá)式中最簡(jiǎn)單的“或”關(guān)系。也可以輸入“(A|B){3,}”,其中{3,}表示匹配前面字符的次數(shù)最少是3次。
(1)只保留特定的log
若想知道每條日志的Tag是什么,觀(guān)察一下打印出來(lái)的日志:
2020-08-22 10:02:44.171 26112-26112/com.example.logtest I/AAA: onStart
對(duì)應(yīng)格式如下:
date time PID-TID/package priority/tag: message
所以只要看到日志,就能根據(jù)位置知道該日志的Tag和Message。這里,PID 代表進(jìn)程標(biāo)識(shí)符;TID 則為線(xiàn)程標(biāo)識(shí)符,如果僅有一個(gè)線(xiàn)程,兩者可以相同;package是包名;tag是日志標(biāo)簽;message是日志信息內(nèi)容。過(guò)濾出指定Tag的日志信息,其正則表達(dá)式可以寫(xiě)成:^(?:tag1|tag2|tag3)
(2)忽略特定的log
在Log Tag中輸入正則表達(dá)式:^(?!.*(AAA)).*$
用^表示匹配的開(kāi)始,用$標(biāo)識(shí)匹配的結(jié)束,!表示否定,其中AAA是要忽略掉的Tag,表示除了標(biāo)簽AAA之外的日志信息全部要顯示。例如: 忽略指定tag的日志信息可以寫(xiě)成:^(?!tag1|tag2|tag3)
(3)除了可以在日志過(guò)濾器中使用正則表達(dá)式對(duì)特定的log進(jìn)行過(guò)濾或忽略,也可以在圖1中的“關(guān)鍵字過(guò)濾”文本搜索框中直接輸入字符串或正則表達(dá)式,但關(guān)鍵字過(guò)濾時(shí)不區(qū)分Tag和Message。
程序開(kāi)發(fā)過(guò)程中出現(xiàn)錯(cuò)誤是不可避免的,錄入程序時(shí)開(kāi)發(fā)環(huán)境即時(shí)可以檢測(cè)語(yǔ)法錯(cuò)誤,并及時(shí)提示我們錯(cuò)誤的位置以及修改的方法,但是邏輯錯(cuò)誤的定位和分析是一件非常困難的事情。當(dāng)程序打印出成百上千行日志的時(shí)候,就會(huì)迫切的需要日志過(guò)濾器了。Android應(yīng)用程序中會(huì)包含很多的類(lèi)名,通常會(huì)為每個(gè)類(lèi)名設(shè)置一個(gè)常量TAG,根據(jù)TAG用日志過(guò)濾器篩選出自己想要看到的日志內(nèi)容。如果要打印多個(gè)類(lèi)的日志內(nèi)容就要使用正則表達(dá)式,在日志過(guò)濾器中使用正則表達(dá)式可以讓用戶(hù)通過(guò)使用特定字符構(gòu)建查詢(xún)模式,其所提供的強(qiáng)大的模式匹配功能大大簡(jiǎn)化了日志篩選工作。當(dāng)然,也只有通過(guò)不斷地實(shí)際使用的過(guò)程,反復(fù)運(yùn)用和精通正則表達(dá)式的所有特殊字符,才能真正體會(huì)到運(yùn)用正則表達(dá)式在日志過(guò)濾中的優(yōu)越性,為程序的調(diào)試提供強(qiáng)有力的支持。