解決方案

2018-02-24 15:48 更新

解決方案

2.1 消滅TAG

我們用TAG就是做定位,同時(shí)方便過濾無意義的log。那么索性把當(dāng)前類名作為這樣一個(gè)TAG的標(biāo)識(shí)。于是,在我們自定義的log類中就用如下代碼設(shè)置tag:

    /**
     * @return 當(dāng)前的類名(simpleName)
     */
    private static String getClassName() {
        String result;
        StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[2];
        result = thisMethodStack.getClassName();
        int lastIndex = result.lastIndexOf(".");
        result = result.substring(lastIndex + 1, result.length());
        return result;
    }

這樣我們就輕易的擺脫了tag的糾纏。

這個(gè)方法來自于豪哥的建議,這里感謝豪哥的意見。

2.2 將Log簡(jiǎn)化

有人說我們IDE不都有代碼提示了么,為啥還用一個(gè)L來做簡(jiǎn)化。首先用L比log能更快的得到提示,輸入一個(gè)l.d就會(huì)直接顯示提示,并且不會(huì)和原本的log類混淆。其次就是調(diào)用更方便。簡(jiǎn)化log這個(gè)東西太簡(jiǎn)單了,直接自定義一個(gè)L類,用作Log的輸出即可。

2.3 在終端能顯示當(dāng)前類名并且增加超鏈

這個(gè)功能其實(shí)ide是支持的,只不過我們可以通過一些神奇的方法來做到更好的效果。下面就給出兩個(gè)可行的方法:

    /**
     * @return 當(dāng)前的類名(全名)
     */
    private static String getClassName() {
        String result;
        StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[1];
        result = thisMethodStack.getClassName();
        return result;
    }

    /**
     * log這個(gè)方法就可以顯示超鏈
     */
    private static String callMethodAndLine() {
        String result = "at ";
        StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[1];
        result += thisMethodStack.getClassName()+ ".";
        result += thisMethodStack.getMethodName();
        result += "(" + thisMethodStack.getFileName();
        result += ":" + thisMethodStack.getLineNumber() + ")  ";
        return result;
    }

2.4 讓log更加美觀

人們對(duì)美的追求真是無止境,更加美麗的log也能方便我們一下子區(qū)分什么是系統(tǒng)打印的,什么是我們自己應(yīng)用打印的。做到這點(diǎn)也比較簡(jiǎn)單,就是在輸出前做點(diǎn)字符串拼接的工作。

 private static final char TOP_LEFT_CORNER = '╔';
    private static final char BOTTOM_LEFT_CORNER = '╚';
    private static final char MIDDLE_CORNER = '╟';
    private static final char HORIZONTAL_DOUBLE_LINE = '║';
    private static final String DOUBLE_DIVIDER = "════════════════════════════════════════════";
    private static final String SINGLE_DIVIDER = "────────────────────────────────────────────";
    private static final String TOP_BORDER = "╔════════════════════════════════════════════════════════════════════════════════════════";
    private static final String BOTTOM_BORDER = "╚════════════════════════════════════════════════════════════════════════════════════════";
    private static final String MIDDLE_BORDER = "╟────────────────────────────────────────────────────────────────────────────────────────";
    private static String TAG = "PRETTYLOGGER";

因?yàn)榇蛴og也是消耗性能的,所以我建議最多只保留出現(xiàn)某些異常(這些異常輕于Exception)時(shí)打印的log,在調(diào)試時(shí)打印的log在提交代碼前請(qǐng)全部清除。

2.5 讓log支持輸出object、map、list、array、jsonStr等對(duì)象

這個(gè)需求實(shí)現(xiàn)起來也比較容易,如果是簡(jiǎn)單的POJO的對(duì)象,我們用反射得到對(duì)象的類變量,通過字符串拼接的方式最終輸出值。如果是map等數(shù)組結(jié)構(gòu),那么就用其內(nèi)部的遍歷依次輸出值和內(nèi)容。如果是json的字符串,就需要判斷json的{},[]這樣的特殊字符進(jìn)行換行處理。

2.6 增加log自動(dòng)化和強(qiáng)制開關(guān)

區(qū)分release和debug版本有系統(tǒng)自帶的BuildConfig.DEBUG變量,用這個(gè)就可以控制是否顯示log了。強(qiáng)制開關(guān)也很簡(jiǎn)單,在log初始化的最后判斷強(qiáng)制開關(guān)是否打開,如果打開那么就覆蓋之前的顯示設(shè)置,直接顯示log。轉(zhuǎn)為代碼就是這樣:

public class BaseApplication extends Application {

    // 定義是否是強(qiáng)制顯示log的模式
    protected static final boolean LOG = false;

    @Override
    public void onCreate() {
        super.onCreate();
        L.init()               // default PRETTYLOGGER or use just init()
                //.setMethodCount(2);            // default 2
                //.hideThreadInfo()             // default shown
                .setMethodOffset(1);           // default 0
        // 在debug下,才顯示log
        L.init().setLogLevel(BuildConfig.DEBUG ? LogLevel.FULL : LogLevel.NONE);
        // 如果是強(qiáng)制顯示log,那么無論在什么模式下都顯示log
        if (BaseApplication.LOG) {
            L.init().setLogLevel(LogLevel.FULL);
        }
    }
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)