Android开发过程当中常常须要向控制台输出日志信息,有些人还在用Log.i(tag,msg)的形式或者system.out.println(msg)方式吗?本篇文章对日志信息输出进行优化,以达到快速定位输出日志位置及输出规范日志的效果。日志输出行展现调用输出日志信息在哪一个文件的第几行,而且能够和点击跳转到对应位置的做用。java
一、在项目中直接调用Log.i(tag,msg)或者println函数,这是初级开发者的作法,不便于后期维护与统一控制。
二、在项目中对输出操做进行封装,在封装类中统一调用,这是成熟开发人员的作法,便于统一控制日志输出,并在发版时取消日志输出操做。
三、对第二种方法进一步优化,让日志全面展现调用信息及方便开发过程当中经过IDE直接跳转到调用位置。本文即对第三种优化进行记录。函数
将常见日志输出操做统一放到一个类中,项目须要输出日志时经过这个类进行调用,相信你们都有封装,此步不作详细说明。优化
咱们在封装Log操做时常常遇到一个难题,那就是TAG如何制定,让调用者做为参数传入仍是固定使用一个常亮?个人操做时自动调出调用位置信息,将这些信息进行处理后做为TAG,查看日志时看一看到是哪一个文件的第几行在输出日志。日志
如下为获取TAG信息的方法,能够直接复制到代码中调用,将其做为文本内容经过println函数输出也可实现此效果。code
/** * 运行栈类名 */ static String stackClassName = ""; /** * 运行栈 */ static StackTraceElement[] stackTraceElements; /** * 获取默认TAG */ private static String getDefaultTag(){ try { //获取当前运行任务栈信息 stackTraceElements = Thread.currentThread().getStackTrace(); //遍历任务栈信息,获取调用者信息并返回 for (StackTraceElement stackTraceElement : stackTraceElements) { stackClassName = stackTraceElement.getClassName() + ""; //仅获取本项目下的非此类调用信息 if (!stackClassName.contains(LogUtil.class.getSimpleName()) && stackClassName.contains("com.")) { return "(" + stackTraceElement.getFileName() + ":" + stackTraceElement.getLineNumber() + ")"; } } } catch (Exception e) { e.printStackTrace(); } return LogUtil.class.getSimpleName(); }