您的位置:首页 > 移动开发 > Android开发

[置顶] android 自定义可跳转的log

2016-08-05 21:16 337 查看
用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.csdn.net/laihuan99/article/details/8929749?utm_source=tuicool
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: