1. 程式人生 > 其它 >掌握日誌工具的使用

掌握日誌工具的使用

掌握日誌工具的使用

使用Android的日誌工具Log

Android中的日誌工具類是Log(android.util.Log),這個類中提供瞭如下5個方法來供我們列印日誌。

Log.v()

用於列印那些最為瑣碎的、意義最小的日誌資訊。對應級別 verbose,是Android日誌裡面級別最低的一種。

Log.d()

用於列印一些除錯資訊,這些資訊對你除錯程式和分析問題應該是有幫助的。對應級別debug,比verbose高一級。

Log.i()

用於列印一些比較重要的資料,這些資料應該是你非常想看到的、可以幫你分析使用者行為資料。對應級別info,比debug高一級。

Log.W()

用於列印一些警告資訊,提示程式在這個地方可能會有潛在的風險,最好去修復一下這些出現警告的地方。對應級別 warn,比info高一級。

Log.e()

用於列印程式中的錯誤資訊,比如程式進入到了catch語句當中。當有錯誤資訊打印出來的時候,一般都代表你的程式出現嚴重問題了,必須儘快修復。對應級別error, 比 warn高一級。

其實很簡單,一共就5個方法,當然每個方法還會有不同的過載,但肯定不是什麼難理解的地方了。我們現在就在專案中試一試日誌工具好不好用吧。

開啟專案,在onCreate()方法中新增一行列印日誌的語句,如下所示:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("HelloworldActivity","onCreate exeecute");
    }
}

Log.d()方法的引數

Log.d()方法中傳入了兩個引數:第一個引數是tag,一般傳入當前的類名就好,主要用於對列印資訊進行過濾;第二個引數是msg,即想要列印的具體的內容。

logcat中的列印資訊

執行一下專案,點選頂部工具欄上的執行按鈕,或者使用快捷鍵Shift+Fl0(Mac系統是control+R),等程式執行完畢,點選Android Studio底部工具欄的Android Monitor,在logcat中就可以看到列印資訊了,如圖(logcat中的列印資訊)所示。

不僅可以看到列印日誌的內容和tag名,就連程式的包名、列印的時間以及應用程式的程序號都可以看到。

為什麼使用Log而不使用System.out

很多的Java新手都非常喜歡使用System.out.println()方法來列印日誌,不知道你是不是也喜歡這麼做。不過在真正的專案開發中,是極度不建議使用System.out.println()方法的!如果在公司的專案中經常使用這個方法,就很有可能要捱罵了。

System.out.println()方法的缺點

為什麼System.out.println()方法會這麼遭大家唾棄呢?這個方法除了使用方便一點之外,其他就一無是處了。方便在哪兒呢?在Eclipse中你只需要輸入syso,然後按下程式碼提示鍵,這個方法就會自動出來了,相信這也是很多Java新手對它鍾情的原因,不過遺憾的是,Android Studio中已經不支援這種快捷輸入了。那缺點又在哪兒了呢?這個就太多了,比如日誌列印不可控制、列印時間無法確定、不能新增過濾器、日誌沒有級別區分......

聽我說了這些,你可能已經不太想用System.out.println()方法了,那麼Log就把上面所說的缺點全部都改好了嗎?雖然談不上全部,但我覺得Log已經做得相當不錯了。我現在就來帶你看看Log和logcat配合的強大之處。

首先剛才提到的快捷輸入,在Android Studio當中也是有的,比如你想列印一條debug級別的日誌,那麼只需要輸入logd,然後按下Tab鍵,就會幫你自動補全一條完整的列印語句。輸人logi,然後按下Tab鍵,會自動補全一條info級別的列印日誌。輸入logw,按下Tab鍵,會自動補全一條warn級別的列印日誌,以此類推。另外,由於Log的所有列印方法都要求傳入一個tag引數,每次寫一遍顯然太過麻煩。這裡還有一個小技巧,我們在onCreate()方法的外面輸入logt,然後按下Tab鍵,這時就會以當前的類名作為值自動生成一個TAG常量,如下所示:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "huangzihan";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("HelloworldActivity","onCreate exeecute");
    }
}

logcat的過濾器

除了快捷輸入之外,logcat中還能很輕鬆地新增過濾器,你可以在圖(logcat中的過濾器)中看到我們目前所有的過濾器。

Show only selected application

表示只顯示當前選中程式的日誌,

Firebase

谷歌提供的一個分析工具,我們可以不用管它

No Filters

相當於沒有過濾器,會把所有的日誌都顯示出來。

自定義過濾器

那可不可以自定義過濾器呢?當然可以,我們現在就來新增一個過濾器試試。點選圖(logcat中的過濾器)中的 Edit Filter Configuration,會彈出一個過濾器配置介面。我們給過濾器起名叫data,並且讓它對名為data的tag進行過濾,如圖(過濾器配置介面)所示

點選OK,你就會發現你已經多出了一個data過濾器。當你點選這個過濾器的時候,你會發現剛才在onCreate()方法裡列印的日誌沒了,這是因為data這個過濾器只會顯示tag名稱為data的日誌。你可以嘗試在onCreate()方法中把列印日誌的語句改成Log.d("data","onCreate
execute")
,然後再次執行程式,你就會在data過濾器下看到這行日誌了。

不知道你有沒有體會到使用過濾器的好處,可能現在還沒有吧。不過當你的程式打印出成百上千行日誌的時候,你就會迫切地需要過濾器了。

logcat中的日誌級別

看完了過濾器,再來看一下logcat中的日誌級別控制吧。logcat中主要有5個級別,分別對應著上一節介紹的5個方法,如圖(logcat中的日誌級別)所示。

verbose是最低等級。這意味著不管我們使用哪一個方法列印日誌,這條日誌都一定會顯示出來。如果將級別選中為debug,只有使用debug及以上級別方法列印的日誌オ會顯示出來,以此類推。你可以做一下試驗,當你把logcat中的級別選中為info、 warn或者error時,我們在onCreate()方法中列印的語句是不會顯示的,因為我們列印日誌時使用的是Log.d()方法。

日誌級別控制的好處就是,你可以很快地找到你所關心的那些日誌。相信如果讓你從上千行日誌中査找一條崩潰資訊,你一定會抓狂的吧。而現在你只需要將日誌級別選中為error,那些不相干的瑣碎資訊就不會再幹擾你的視線了。

關鍵字過濾

最後我們再來看一下關鍵字過濾。如果使用過濾器加日誌級別控制還是不能鎖定到你想檢視的日誌內容的話,那麼還可以通過關鍵字進行進一步的過濾,如圖(關鍵字輸入框)所示。

我們可以在輸入框裡輸入關鍵字的內容,這樣只有符合關鍵字條件的日誌才會顯示出來,從而能夠快速定位到任何你想査看的日誌。另外還有一點需要注意,關鍵字過濾是支援正則表示式的,有了這個特性,我們就可以構建出更加豐富的過濾條件。