码迷,mamicode.com
首页 > 其他好文 > 详细

一个功能强大的日志工具类

时间:2016-12-17 23:00:08      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:方法   源码   进一步   字符   current   https   字符串   相关   技术分享   

    日志可谓是开发中必不可少的工具了, 但是一般的日志信息难以满足我们的需要,特别是对于大一点的复杂的项目,日志太多,经常导致我们定位不到打印日志的位置.因此我们希望打印的日志能告诉我们日志是在哪里打印的,哪个类,哪个方法,哪一行? 更进一步,最好我点击日志就能跳转到源码处,那就更好啦.

  同时,对于一些模块很多的大型app,bug偶尔出现的情况, 有时要修复bug通常要联系整个模块的上下文信息才能找到, 这时我们可以将同一个模块的TAG设置为一样的,最好能将相关日志写入本地,以便测试提出bug的时候我们可以直接去手机里查看日志即可.最终效果图如下:

技术分享

可以看到有具体的线程信息,类信息,方法信息,以及源码位置,并且点击链接将跳转到源码处,同时,json已经格式化了,看着很方便.

 

 

下面说说怎么实现.

那怎么获取类名方法名,行数呢?这时就需要用到StackTraceElement类了,我们知道,在方法执行时,线程会将该方法压入栈,因此可以通过线程获取相应的栈帧元素,来取得方法的调用信息.

如下图所示:

技术分享

技术分享

技术分享

可以看到,线程的调用轨迹,我们可以利用这个获取到方法被调用对应的StackTraceElement.

StackTraceElement LogElement = Thread.currentThread().getStackTrace()[4];//这里去index为4是与具体方法调用深度有关
String fullClassName = LogElement.getClassName();
String threadName = Thread.currentThread().getName();
String className = fullClassName.substring(fullClassName.lastIndexOf(".") + 1);
String methodName = LogElement.getMethodName();
String fileName = LogElement.getFileName();
int lineNumber = LogElement.getLineNumber();

再然后,组装这些日志信息:
StringBuffer buffer = new StringBuffer();
buffer.append("at ");//链接到源码
buffer.append("[");
buffer.append(threadName);
buffer.append(":");
buffer.append(className);
buffer.append(".");
buffer.append(methodName);
buffer.append("(");
buffer.append(fileName);
buffer.append(":");
buffer.append(lineNumber);
buffer.append(")");
buffer.append("] ");
buffer.append(log);

同时,我们可以通过buffer.append("at ")来链接到源码位置.

最后,通过分析json字符串的规律,我们通过代码对其进行格式化输出,方便查看; 以可以将日志写入本地文件方便查看.

最后放一下GitHub,欢迎star.

Github:https://github.com/wytiger/MyLog

 

一个功能强大的日志工具类

标签:方法   源码   进一步   字符   current   https   字符串   相关   技术分享   

原文地址:http://www.cnblogs.com/wytiger/p/6193061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!