自定义信息丰富的Android Log
【问题背景】
最近在项目上需要用LOG来查看和定位一些信息,但是系统原生的LOG实在太乱,信息也不太多,比如调用行数,所在方法,所在类名,线程名称都没有。
【初步想法】
本着开源的精神,首先去GitHub上面搜寻了一番,果然发现了不少优秀的项目,经过对比,选定了,Logger和Timber
【遇到的问题】
毫无疑问,Logger和Timber都是非常优秀的项目,但是我们在使用过程中还是遇到了一些问题。
1.Logger在进行日志搜索的时候只会显示搜索行,其他信息丢失了
举个例子,下面是Logger的正常输出,但是当我们搜索关键字test3的时候,就只会显示一行||test3,其他可爱的信息就丢失掉了
2.Timber的其他信息过少。
【解决】
既然都不符合我们的要求,那么我们就自己写吧,首先观察Logger是如何做到打印方法名和行数等信息的
通过查看源码,我们发现看似复杂的流程其实一点都不复杂,JAVA的设计者们早就为我们准备好了相关的类和信息。
最关键的代码就是这一行
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
那么,这个getStackTrace里面发生了什么?返回的StackTraceElement里面又包含了什么信息呢?
通过查找官方的文档,我们找到了这么一句,Provides programmatic access to the stack trace information printed by printStackTrace();
翻译过来就是,提供程序性的对printStackTrace()所打印信息的访问。
printStackTrace()看起来是不是有点眼熟,对了,就是在我们处理异常的时候在catch里面的最常用处理方式,e.printStackTrace();
这个函数会打印出异常的详细信息,例如线程,方法名,行数等等,这些信息正是我们需要的!
那么返回的StackTraceElement数组里面又是装的什么东西呢?
官方文档也给了我们答案
An element in a stack trace, as returned by Throwable.getStackTrace(). Each element represents a single stack frame. All stack frames except for the one at the top of the stack represent a method invocation. The frame at the top of the stack represents the execution point at which the stack trace was generated. Typically, this is the point at which the throwable corresponding to the stack trace was created.
简单的说里面每个元素都代表了一个栈帧。
有了以上的信息,我们就可以开始动手了。
下面是代码
private static String getInfo()
{
Throwable stack = new Throwable().fillInStackTrace();//获得栈
StackTraceElement[] trace = stack.getStackTrace();
return " |***ThreadName:"+Thread.currentThread().getName()+" |***MethodName:"+ trace[2].getMethodName() + " |***LineAt:" + trace[2].getLineNumber();//获得想要的信息
}
private static String getTag(){
Throwable stack = new Throwable().fillInStackTrace();
StackTraceElement[] trace = stack.getStackTrace();
return trace[2].getClassName();
}
public static void v(String msg)
{
msg = "|***Message:" + msg;
msg += getInfo();
Timber.tag(getTag());
Timber.v(msg);
}
有了代码,让我们看看最终的效果
可以看到,我们所需要的信息都被打印出来了,而且在同一行,虽然简答,但是却非常的实用,这样在我们搜索的时候,就可以看到更多的信息啦。
【总结】
JAVA其实所包含的内容非常多,我平时对JAVA的了解还稍显浅薄,很多看似神奇的开源项目就其本身的实现来说是比较简单的,不能光会用,而且要根据自己的需求来进行合理的改造,虚心学习,勤于总结。
自定义信息丰富的Android Log的更多相关文章
- 【朝花夕拾】Android Log篇
前言 从事Android开发的这些年中,经常碰到这样一个现象:同一款app中,往往有好几种风格迥异的log处理方式,有时候会让维护者晕头转向.同时笔者也经常碰带一些模棱两可的问题:Log等级分好几种 ...
- 移动开发首页业界资讯移动应用平台技术专题 输入您要搜索的内容 基于Java Socket的自定义协议,实现Android与服务器的长连接(二)
在阅读本文前需要对socket以及自定义协议有一个基本的了解,可以先查看上一篇文章<基于Java Socket的自定义协议,实现Android与服务器的长连接(一)>学习相关的基础知识点. ...
- Android Log介绍
android.util.Log常用的方法有以下5个:Log.v() ,Log.d() ,Log.i() ,Log.w() ,Log.e() .按照日志级别从高到低为ERROR, WARN, INFO ...
- Android Log图文详解
android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母对应VERBOSE,DEBUG,INFO, WA ...
- android log机制——输出log【转】
转自:http://blog.csdn.net/tdstds/article/details/19084327 目录(?)[-] 在android Java code中输出log Logprintln ...
- android Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一睹为快,希望对大家入门Android Log有一定的帮助. android. ...
- android Log.isLoggable步骤的使用
原文地址: http://www.cnblogs.com/maxinliang/p/4024442.html android Log.isLoggable方法的使用 android 动态控制logca ...
- android log 学习
一,Bug出现了, 需要“干掉”它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug, a ...
- 解读Android LOG机制的实现【转】
转自:http://www.cnblogs.com/hoys/archive/2011/09/30/2196199.html http://armboard.taobao.com/ Android提供 ...
随机推荐
- Codeforces Round #249 (Div. 2)-D
这场的c实在不想做,sad. D: 标记一下每个点8个方向不经过黑点最多能到达多少个黑点. 由题意可知.三角形都是等腰三角形,那么我们就枚举三角形的顶点. 对于每个定点.有8个方向能够放三角形. 然后 ...
- gitlab安装、配置与阿里云产品集成
https://www.ilanni.com/?p=12819 一.gitlab安装与部署 gitlab的安装可以分为源码安装和通过安装包进行安装,要是按照我以前的写作习惯的话,我也会把源码安装在本文 ...
- NFS搭建与配置
NFS应用场景是:A,B,C三台机器上需要保证被访问到的文件是一样的,A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致性 172.131.1.135 服务器端 1 ...
- 安装sphinx报错(undefined reference to `libiconv_open' 、undefined reference to `libiconv'、undefined reference to `libiconv_close'、make[1]: *** No rule to make target `all'. Stop. 、make: *** [all-recursive
(为知笔记copy过来格式有变,希望对遇到此问题的童鞋有帮助) 具体错误: Thank you for choosing Sphinx! [root@vm-vagrant csft-4.1]# mak ...
- Micro-PaaS(Docker+K8S)
1.概述 Docker是一种Linux容器工具集,它是为构建(Build).交付(Ship)和运行(Run)分布式应用而设计的. Kubernates:是开源的容器集群管理系统.它构建在Docker技 ...
- Unit04: JSP基本语法 、 JSP运行原理
Unit04: JSP基本语法 . JSP运行原理 hello.jsp <%@page pageEncoding="utf-8"%> <!doctype html ...
- linux安装oracle12c
参考: https://blog.csdn.net/who__are__you_/article/details/79178303 记录:
- Java经典练习题_Day03
一.选择 B D(死循环) E(switch) BC 二.编程 1.读入一个整数,表示一个人的年龄. 如果小于6岁,则输出“儿童”, 6岁到13岁,输出“少儿”; 14岁到18岁, ...
- POJ 2566 Bound Found(尺取法,前缀和)
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5207 Accepted: 1667 Spe ...
- 定位SDK返回时间问题
关于怎么使用定位SDK ,这里不做介绍,可以去看api:http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0 ...