用android studio打log,一般会是这种样式log.v(tag,”log content”);给程序调试带来很多方便,不过当程序越来越大,或者忘记在哪里打的log,再在代码中寻找打log的语句就有些麻烦,当然你可以也可以用全局搜索,不过log多了也是很吃力的;
我们知道程序报错时,会在抛出异常时打印这些,其中出错点使可以直接跳转过去的;如图:
那么我们自己的log也可以自定义成可跳转的,事实上,只要你的log打印的字符串符合某种规则,android studio会自动添加超链接,要实现很简单,就根据上图中字符串的组织形式自己拼接就可以了。
在eclipse中 一般“at (packagename.classname.java:行号) ”这种形式;
在android studio中一般是:“at packagename.classname.medthod(classname.java:行号)”,
我们可以将获取包名,类名,行号的语句添加再自己的log.class 中,由于log不可继承,我们将封装好的字符串作为log.v(,)的msg传入就好。
得到行号等信息需要用到stackTrace(),我们在处理异常时就是在printstackTrace();不难想象,get到的就是一个数组,其中从0到数组尾分别存放了对应栈的一个栈帧,栈顶元素保存在数组第0号;
那么我们log.v()代码是在第0号元素吗? 并不是,尝试分别打印其对应的classname或linenumber,有些信息是获取不到的,即使获取到也不是我们想要的,查阅资料,在我们调用 getstacktrack方法之后,程序本身自己又进行了四次调用,等我们得到elements后,存放打印log的element位置已经到了第4号,所以要从数组下标3进行获取,其实也可以直接打印获取到的stackTrace,找到我们想要的那一条,确定它在哪个位置;
于是就可以自定义log了 我写的代码如下
import android.util.Log;
public class l {
public static String s = "";
private static int i=3
private enum LogState {
INFO, ERROR, ALL;
}
public static final LogState CURRENT_STATE = LogState.ALL;
public static void i(final String msg) {
StackTraceElement[] elements = Thread.currentThread().getStackTrace();
if (elements.length < 5) {
Log.v("test", "myLog error elements.length < 5");
} else {
s = "at " + elements[i].getClassName() + "." + elements[i].getMethodName() + "(" + elements[i].getClassName().substring(elements[i].getClassName().lastIndexOf(".") + 1, elements[i].getClassName().length()) +
".java:"
+ elements[i].getLineNumber() + ")";
}
switch (CURRENT_STATE) {
case ALL:
case INFO:
Log.v("test", s + " " + msg);
}
}
}
在这里将log的tag写死成“test”,也可以自己设定,经android studio测试,可以打印出有跳转到log语句;
效果图:
本文对log4J部分并未深究,难免有不妥甚至谬误,请不吝指正!
参考文献:
http://www.tuicool.com/articles/QbYjYj
http://javaeedevelop.iteye.com/blog/1729402
http://www.tuicool.com/articles/QbYjYj
http://blog.youkuaiyun.com/laihuan99/article/details/8929749?utm_source=tuicool