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