Android開發時經常用的LogUtil,android開發logutil

來源:互聯網
上載者:User

Android開發時經常用的LogUtil,android開發logutil

在開發過程中經常用到Log,我們常寫的一種方式就是自訂一個LogUtil工具類

    private static boolean LOGV = true;    private static boolean LOGD = true;    private static boolean LOGI = true;    private static boolean LOGW = true;    private static boolean LOGE = true;    public static void v(String tag, String mess) {        if (LOGV) { Log.v(tag, mess); }    }    public static void d(String tag, String mess) {        if (LOGD) { Log.d(tag, mess); }    }    public static void i(String tag, String mess) {        if (LOGI) { Log.i(tag, mess); }    }    public static void w(String tag, String mess) {        if (LOGW) { Log.w(tag, mess); }    }    public static void e(String tag, String mess) {        if (LOGE) { Log.e(tag, mess); }    }

這樣的工具類可以將log分類,在發布應用時選擇性關閉log,比較方便。
但問題是,跟直接使用Log類似,需要定義一個TAG,常用的辦法是在每個需要打log的類定義一個靜態字串常量TAG,賦值為類名。如果,在重構時忘記修改TAG,這樣在查看log時就可能會迷糊。當然,也有很多人會圖方便,直接用System.out.println(str);輸出。
前兩天看VolleyLog時,學習到一種新的方法,

    private static String getTag() {        StackTraceElement[] trace = new Throwable().fillInStackTrace()                .getStackTrace();        String callingClass = "";        for (int i = 2; i < trace.length; i++) {            Class<?> clazz = trace[i].getClass();            if (!clazz.equals(LogUtil.class)) {                callingClass = trace[i].getClassName();                callingClass = callingClass.substring(callingClass                        .lastIndexOf('.') + 1);                break;            }        }        return callingClass;    }

這個方法可以直接擷取到調用者的類名。使用如下:

    public static void v(String mess) {        if (LOGV) { Log.v(getTag(), mess); }    }    public static void d(String mess) {        if (LOGD) { Log.d(getTag(), mess); }    }    public static void i(String mess) {        if (LOGI) { Log.i(getTag(), mess); }    }    public static void w(String mess) {        if (LOGW) { Log.w(getTag(), mess); }    }    public static void e(String mess) {        if (LOGE) { Log.e(getTag(), mess); }    }

如此就不需要再在類中定義TAG了。

在偵錯工具時,我們會經常列印一些資訊,包括方法名/行號之類的,下面一個方法就可以省去這些麻煩:

    private static String buildMessage(String msg) {        StackTraceElement[] trace = new Throwable().fillInStackTrace()                .getStackTrace();        String caller = "";        for (int i = 2; i < trace.length; i++) {            Class<?> clazz = trace[i].getClass();            if (!clazz.equals(LogUtil.class)) {                caller = trace[i].getMethodName();                break;            }        }        return String.format(Locale.US, "[%d] %s: %s", Thread.currentThread()                .getId(), caller, msg);    }

使用方法如下:

    public static void v(String mess) {        if (LOGV) { Log.v(getTag(), buildMessage(mess)); }    }    public static void d(String mess) {        if (LOGD) { Log.d(getTag(), buildMessage(mess)); }    }    public static void i(String mess) {        if (LOGI) { Log.i(getTag(), buildMessage(mess)); }    }    public static void w(String mess) {        if (LOGW) { Log.w(getTag(), buildMessage(mess)); }    }    public static void e(String mess) {        if (LOGE) { Log.e(getTag(), buildMessage(mess)); }    }

這樣每次列印log的時候就很方便了,直接鍵入:LogUtil.v(msg);
不需要管TAG,方法名,還有線程ID等等資訊

再一步最佳化就是格式化msg的內容

buildMessage(String format, Object... args)

最後說明一下,如果大量log這樣打會影響程式的效能,所以這樣的方法只是方便在調試時使用,在發布時,可以把調試的log關閉掉。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.