这种Logger能够打印出Log的类名,方法名,以及调用的行数。

写这个的人也真是对于Java的错误机制有一个全面的了解了。

关键只在于一个叫做StackTraceElement的类
通过它就可以获得上述的类名、方法名和行数。

下面是几个关键方法:

1
2
3
4
5
6
7
8
9
10
11
public static void d(String content) {
if (!allowD) return;
StackTraceElement caller = OtherUtils.getCallerStackTraceElement();
String tag = generateTag(caller);

if (customLogger != null) {
customLogger.d(tag, content);
} else {
Log.d(tag, content);
}
}
1
2
3
public static StackTraceElement getCallerStackTraceElement() {
return Thread.currentThread().getStackTrace()[4];
}
1
2
3
4
5
6
7
8
private static String generateTag(StackTraceElement caller) {
String tag = "%s.%s(L:%d)";
String callerClazzName = caller.getClassName();
callerClazzName = callerClazzName.substring(callerClazzName.lastIndexOf(".") + 1);
tag = String.format(tag, callerClazzName, caller.getMethodName(), caller.getLineNumber());
tag = TextUtils.isEmpty(customTagPrefix) ? tag : customTagPrefix + ":" + tag;
return tag;
}