前言
Log日志的打印一直是一個比較頭疼的事,怎樣才能讓自己的log顯示更多信息,怎樣才能讓自己的log更好的幫助我們定位問題,幫助調試,一直是我關注的問題。
我將Log打印封裝到LogUtil類中,這篇文章涉及以下內容
- LogUtil的優勢
- LogUtil的實現原理
- LogUtil的使用
- 項目結構圖和效果圖
一. LogUtil的優勢
LogUtil打印封裝類,其有以下優點:
- 顯示當前項目的包名
- 顯示當前日志級別
- 顯示tag
- 顯示log所在類的類名
- 顯示log調用處所在的方法名
- 顯示log所在的行數
- 點擊行數定位到具體代碼處
二. LogUtil的實現原理
LogUtil能顯示這么多信息,全在於StackTraceElement的功勞,StackTraceElement表示StackTrace(堆棧軌跡)中的一個元素,屬性包括方法調用者的類名、方法名、文件名以及調用的行數,它是一個final類
它在LogUtil中會做類似如下功能的處理:
StackTraceElement elements[] = Thread.currentThread().getStackTrace();
for (int i = 0; i < elements.length; i++) {
StackTraceElement stackTraceElement = elements[i];
String className = stackTraceElement.getClassName();
String methodName = stackTraceElement.getMethodName();
String fileName = stackTraceElement.getFileName();
int lineNumber = stackTraceElement.getLineNumber();
System.out.println("StackTraceElement數組下標 i=" + i + "----------fileName="
+ fileName + "----------className=" + className + "----------methodName=" + methodName + "----------lineNumber=" + lineNumber);
}
在android中最原始的log打印,我們會類似這么用:
Log.i(String tag,String msg);
為了讓log能更規范,顯示更多信息,於是我將 tag 用方法formatLog(String tag)進行格式化處理,
formatLog 代碼如下:
private static String formatLog(String tag) {
StackTraceElement traceElements[] = Thread.currentThread().getStackTrace();
StackTraceElement element = traceElements[4];
String className = element.getClassName();
String methodName = element.getMethodName();
String fileName = element.getFileName();
int lineNumber = element.getLineNumber();
if(className!=null&&className.contains(".")){
className=className.substring(className.lastIndexOf(".")+1,className.length());
}
StringBuffer buffer = new StringBuffer();
buffer.append(tag + ":");
buffer.append(className + ".");
buffer.append(methodName + "(");
buffer.append(fileName + ":");
buffer.append(lineNumber + ")");
return buffer.toString();
}
為了防止log中的msg過長顯示不全,LogUtil對傳統的log中的msg做如下處理:
private static void printLog(String tag, String msg, String type) {
int count = msg.length();
if (count > 4000) {
for (int i = 0; i < count; i += 4000) {
if (i + 4000 < count) {
printByLogType(tag, msg.substring(i, i + 4000), type);
} else {
printByLogType(tag, msg.substring(i, msg.length()), type);
}
}
} else {
printByLogType(tag, msg, type);
}
}
這樣就實現了LogUtil的主要邏輯。
三. LogUtil的使用
3.1 快速打印log
快速打印log時,log的tag會固定為LogUtil中的TAG值,你可以這樣調用:
LogUtil.w("=====測試按鈕被點擊了====");
3.2 定義自己的tag日志
如果你想定義一個tag=”abc“的log方便自己調試,你可以這樣:
LogUtil.w("abc","=====測試按鈕被點擊了====");
打印出的log類似下面這樣:
里面包含包名,日志級別,tag,類名,方法名和log的行數
四. 項目結構圖和效果圖
項目結構截圖
運行效果圖
超高逼格Log日志打印
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權