LogUtils是Log工具,类似android.util.Log。
tag自动产生,格式: customTagPrefix:className.methodName(L:lineNumber),
customTagPrefix为空时只输出:className.methodName(L:lineNumber)。
为什么Thread.currentThread().getStackTrace()[4],下标是4 ?
下面修改源码分析这个问题:
在OtherUtils.getCallerStackTraceElement中添加至如下:
新建一个工程,在MainActivity.onCreate中如下使用:
tag自动产生,格式: customTagPrefix:className.methodName(L:lineNumber),
customTagPrefix为空时只输出:className.methodName(L:lineNumber)。
源码实现:
class OtherUtils //辅助类
{
<snip>
public static StackTraceElement getCallerStackTraceElement() {
return Thread.currentThread().getStackTrace()[4]; //为什么是4?
}
<snip>
}
class LogUtils
{
<snip>
public static String customTagPrefix = "";
StackTraceElement caller = OtherUtils.getCallerStackTraceElement();
private static String generateTag(StackTraceElement caller) { //生成tag
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;
}
public static void v(String content) { //实际使用的log函数
if (!allowV) return;
StackTraceElement caller = OtherUtils.getCallerStackTraceElement();
String tag = generateTag(caller);
if (customLogger != null) {
customLogger.v(tag, content);
} else {
Log.v(tag, content);
}
}
<snip>
}
为什么Thread.currentThread().getStackTrace()[4],下标是4 ?
下面修改源码分析这个问题:
在OtherUtils.getCallerStackTraceElement中添加至如下:
public static StackTraceElement getCallerStackTraceElement() {
//for debug
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
for(StackTraceElement ste:stes)
{
System.out.println(ste.toString());
}
return Thread.currentThread().getStackTrace()[4];
}新建一个工程,在MainActivity.onCreate中如下使用:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LogUtils.customTagPrefix = "xUtilsSample"; // 方便调试时过滤 adb logcat 输出
LogUtils.e("这是下标为4的输出,上面是当前整个调用栈的情况");
}
可以看到输出的tag正是整个调用栈中下标为4的元素内容.
本文介绍了一个自定义的日志工具LogUtils,它能够自动为日志生成包含类名、方法名及行号的标签。通过调整参数customTagPrefix,可以自定义前缀。文章还解析了为何获取调用堆栈中的第四个元素。
1005

被折叠的 条评论
为什么被折叠?



