日志可谓是开发中必不可少的工具了, 但是一般的日志信息难以满足我们的需要,特别是对于大一点的复杂的项目,日志太多,经常导致我们定位不到打印日志的位置.因此我们希望打印的日志能告诉我们日志是在哪里打印的,哪个类,哪个方法,哪一行? 更进一步,最好我点击日志就能跳转到源码处,那就更好啦.
同时,对于一些模块很多的大型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
时间: 2024-11-05 14:39:28