背景
我們在開發(fā)的時(shí)候肯定會打一些Log,特別是在調(diào)試代碼或者bug的時(shí)候,我們都會打一些Log日志來記錄,但是當(dāng)我們發(fā)布正式版本的時(shí)候,尼瑪,要一行一行的去掉,這就尷尬了。
懵逼狀態(tài)
勵志封裝Log庫
本來想使用github上的Logger庫的,但是感覺有點(diǎn)煩中,后面看到了鴻洋大師寫過一篇關(guān)于Log庫的文章 Android反觀Log庫后面我也是根據(jù)這個(gè)來簡單的修改的
自定義內(nèi)容
- 增加變量來區(qū)分debug模式還是release模式,在release的情況下將所有的Log日志都去掉。
- 利用StackTraceElement來輸出我們的Log的位置,便于我們定位和尋找日志。
實(shí)現(xiàn)
我們以i的log來作為例子:
/**
* iiiiiiiiiiiiii
* @param content
*/
public static void i(String content){
i(null,content);
}
public static void i(String tag,String content){
if (!sDebug) return;
printer.i(getFinalTag(tag),content);
}
其中的isDebug是我們的標(biāo)識位,我們可以把它在初始化的時(shí)候來與編譯類型綁定起來。
其中Printer類是實(shí)現(xiàn)了打印Log日志功能的輸出類:
public class LogPrint implements Printer{
@Override
public void d(String message, String str) {
new DebugLogText(message).setup(str);
}
@Override
public void e(String message, String str) {
new ErrorLogText(message).setup(str);
}
@Override
public void e(String message, String str,Throwable throwable) {
new ErrorLogText(message).setup(str+throwable.getMessage());
}
@Override
public void w(String message, String str) {
new WarnLogText(message).setup(str);
}
@Override
public void i(String message, String str) {
new InfoLogText(message).setup(str);
}
@Override
public void v(String message, String str) {
new VerboseLogText(message).setup(str);
}
@Override
public void wtf(String message, Object... args) {
}
@Override
public void json(String message, String json) {
new InfoLogText(message).setup(json);
}
@Override
public void xml(String xml) {
}
@Override
public void clear() {
}
}
具體的輸出類型是由對應(yīng)的Log類型來產(chǎn)生,我們來看一個(gè)類InfoLogText:
public class InfoLogText extends LogText {
public InfoLogText(String tag) {
super(tag);
}
@Override
protected void setUpHeader() {
Log.i(mTag, SINGLE_DIVIDER);
}
@Override
protected void setUpFooter() {
Log.i(mTag, DOUBLE_DIVIDER);
}
@Override
protected void setUpContent(String content) {
StackTraceElement targetStackTraceElement = getTargetStackTraceElement();
Log.i(mTag, "(" + targetStackTraceElement.getFileName() + ":"
+ targetStackTraceElement.getLineNumber() + ")");
Log.i(mTag, content);
}
}
總結(jié)
我們可以看到,它實(shí)際調(diào)用的是系統(tǒng)的Log的日志方法,當(dāng)然拼接了,對應(yīng)的Log日志的類和行數(shù),具體的原理我們可以查看上面提到的鴻洋的文章。
好了,我么大家來看一下最后的日志效果
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ********************************************
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: (MainActivity.java:30)
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: is a test
11-30 23:41:52.149 3580-3580/com.aotuman.weather I/aotuman: ════════════════════════════════════════════
最后附上源碼的下載地址,喜歡的朋友可以下載使用,代碼很少,也可以相互交流Android自定義Log庫
https://github.com/OnlyTerminator/CustomLog