我們用TAG就是做定位,同時方便過濾無意義的log。那么索性把當前類名作為這樣一個TAG的標識。于是,在我們自定義的log類中就用如下代碼設(shè)置tag:
/**
* @return 當前的類名(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的糾纏。
這個方法來自于豪哥的建議,這里感謝豪哥的意見。
有人說我們IDE不都有代碼提示了么,為啥還用一個L來做簡化。首先用L比log能更快的得到提示,輸入一個l.d就會直接顯示提示,并且不會和原本的log類混淆。其次就是調(diào)用更方便。簡化log這個東西太簡單了,直接自定義一個L類,用作Log的輸出即可。
這個功能其實ide是支持的,只不過我們可以通過一些神奇的方法來做到更好的效果。下面就給出兩個可行的方法:
/**
* @return 當前的類名(全名)
*/
private static String getClassName() {
String result;
StackTraceElement thisMethodStack = (new Exception()).getStackTrace()[1];
result = thisMethodStack.getClassName();
return result;
}
/**
* log這個方法就可以顯示超鏈
*/
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;
}
人們對美的追求真是無止境,更加美麗的log也能方便我們一下子區(qū)分什么是系統(tǒng)打印的,什么是我們自己應用打印的。做到這點也比較簡單,就是在輸出前做點字符串拼接的工作。
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";
因為打印log也是消耗性能的,所以我建議最多只保留出現(xiàn)某些異常(這些異常輕于Exception)時打印的log,在調(diào)試時打印的log在提交代碼前請全部清除。
這個需求實現(xiàn)起來也比較容易,如果是簡單的POJO的對象,我們用反射得到對象的類變量,通過字符串拼接的方式最終輸出值。如果是map等數(shù)組結(jié)構(gòu),那么就用其內(nèi)部的遍歷依次輸出值和內(nèi)容。如果是json的字符串,就需要判斷json的{}
,[]
這樣的特殊字符進行換行處理。
區(qū)分release和debug版本有系統(tǒng)自帶的BuildConfig.DEBUG變量,用這個就可以控制是否顯示log了。強制開關(guān)也很簡單,在log初始化的最后判斷強制開關(guān)是否打開,如果打開那么就覆蓋之前的顯示設(shè)置,直接顯示log。轉(zhuǎn)為代碼就是這樣:
public class BaseApplication extends Application {
// 定義是否是強制顯示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);
// 如果是強制顯示log,那么無論在什么模式下都顯示log
if (BaseApplication.LOG) {
L.init().setLogLevel(LogLevel.FULL);
}
}
}
更多建議: