我们在做开发编码时,难免会打印一些日志来分析,通常用Android的Log打印日志时,只有基本的日志信息,效果如下图
日志包含以下基本信息
- 日期和时间:如上图中的2021-12-18 23:13:48.386,时间精确到毫秒
- 进程和线程:如上图中的进程id是3800,线程id是3800
- 包名:如上图中的com.aloe.demo01
- 日志级别:如上图中的D代码debug级别,可以根据级别进行过虑,级别分为Verbose,Debug,Info,Warn,Error和Assert,级别依次从小到大
- 日志标签:如上图中的aloe,可以根据这个标签进行过滤
- 日志信息:如上图中的你好,龙儿筝!
从以上信息可以发现日志信息还是挺全面的,包含的信息也很多,对我们的开发,分析,找问题都是十分的有帮助。尽管信息很全面,但有一个致命的缺陷,就是日志没有定位功能,不知道这条日志是哪个地方打印的,也不支持跳转,当日志信息很多的时候,这对于我们查找是极不方便的。我们可以针对日志定位功能,写一个工具类,代码如下
private const val stackTraceLength = 4
fun String?.log(type: Int = Log.DEBUG, tag: String = "aloe") {
if (!BuildConfig.DEBUG || this == null) return
val element = Thread.currentThread().stackTrace[stackTraceLength]
val txt = "${element.methodName}(${element.fileName}:${element.lineNumber}) $this"
when (type) {
Log.DEBUG -> Log.d(tag, txt)
Log.INFO -> Log.i(tag, txt)
Log.WARN -> Log.w(tag, txt)
Log.ERROR -> Log.e(tag, txt)
else -> {}
}
}
一个方法轻松搞定,stackTraceLength是定义调用栈的深度,不同的封装,这个值可能不一定,大家根据自己的风格来确定。
- 第一行判断非调试环境或日志内容为空,则不打印
- 第二行是获取当前线程方法调用栈,取第stackTraceLength个
- 第三行是拿到栈信息获取方法名,所在的类名以及行号
- 后面根据日志级别打印不同的日志
最终效果如下
一个支持点击跳转的日志功能就完成了,是不是非常简单,再也不用依赖第三方框架了,自己动手,丰衣足食。