博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
超高逼格Log日志打印
阅读量:6974 次
发布时间:2019-06-27

本文共 2955 字,大约阅读时间需要 9 分钟。

代码地址如下:

前言

Log日志的打印一直是一个比较头疼的事,怎样才能让自己的log显示更多信息,怎样才能让自己的log更好的帮助我们定位问题,帮助调试,一直是我关注的问题。

我将Log打印封装到LogUtil类中,这篇文章涉及以下内容

  1. LogUtil的优势
  2. LogUtil的实现原理
  3. LogUtil的使用
  4. 项目结构图和效果图
一. LogUtil的优势

LogUtil打印封装类,其有以下优点:

  1. 显示当前项目的包名
  2. 显示当前日志级别
  3. 显示tag
  4. 显示log所在类的类名
  5. 显示log调用处所在的方法名
  6. 显示log所在的行数
  7. 点击行数定位到具体代码处
二. LogUtil的实现原理

LogUtil能显示这么多信息,全在于StackTraceElement的功劳,StackTraceElement表示StackTrace(堆栈轨迹)中的一个元素,属性包括方法调用者的类名、方法名、文件名以及调用的行数,它是一个final类

它在LogUtil中会做类似如下功能的处理:

StackTraceElement elements[] = Thread.currentThread().getStackTrace();          for (int i = 0; i < elements.length; i++) {              StackTraceElement stackTraceElement = elements[i];              String className = stackTraceElement.getClassName();              String methodName = stackTraceElement.getMethodName();              String fileName = stackTraceElement.getFileName();              int lineNumber = stackTraceElement.getLineNumber();              System.out.println("StackTraceElement数组下标 i=" + i + "----------fileName="                      + fileName + "----------className=" + className + "----------methodName=" + methodName + "----------lineNumber=" + lineNumber);          }

在android中最原始的log打印,我们会类似这么用:

Log.i(String tag,String msg);

为了让log能更规范,显示更多信息,于是我将 tag 用方法formatLog(String tag)进行格式化处理,

formatLog 代码如下:

private static String formatLog(String tag) {        StackTraceElement traceElements[] = Thread.currentThread().getStackTrace();        StackTraceElement element = traceElements[4];        String className = element.getClassName();        String methodName = element.getMethodName();        String fileName = element.getFileName();        int lineNumber = element.getLineNumber();        if(className!=null&&className.contains(".")){            className=className.substring(className.lastIndexOf(".")+1,className.length());        }        StringBuffer buffer = new StringBuffer();        buffer.append(tag + ":");        buffer.append(className + ".");        buffer.append(methodName + "(");        buffer.append(fileName + ":");        buffer.append(lineNumber + ")");        return buffer.toString();    }

为了防止log中的msg过长显示不全,LogUtil对传统的log中的msg做如下处理:

private static void printLog(String tag, String msg, String type) {        int count = msg.length();        if (count > 4000) {            for (int i = 0; i < count; i += 4000) {                if (i + 4000 < count) {                    printByLogType(tag, msg.substring(i, i + 4000), type);                } else {                    printByLogType(tag, msg.substring(i, msg.length()), type);                }            }        } else {            printByLogType(tag, msg, type);        }    }

这样就实现了LogUtil的主要逻辑。

三. LogUtil的使用
3.1 快速打印log

快速打印log时,log的tag会固定为LogUtil中的TAG值,你可以这样调用:

LogUtil.w("=====測試按鈕被點擊了====");
3.2 定义自己的tag日志

如果你想定义一个tag=”abc“的log方便自己调试,你可以这样:

LogUtil.w("abc","=====測試按鈕被點擊了====");

打印出的log类似下面这样:

8qIaNPyisrRA4ztvyUg.png

里面包含包名,日志级别,tag,类名,方法名和log的行数

四. 项目结构图和效果图

项目结构截图

Zv2ypSE8TNAfJtBMG5l.png

运行效果图

Lsw1vgCC5RT5MilXiRC.gif

超高逼格Log日志打印

代码地址如下:

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

你可能感兴趣的文章
Delphi 中的 XMLDocument 类详解(14) - 遍历 XML 文件
查看>>
《gradle 用户指南》中文版 第2章 概述
查看>>
Dockerfile指令
查看>>
FFmpeg 学习资料
查看>>
Redis实现分布式锁
查看>>
Phonegap 工作原理
查看>>
连载-第2章 嵌入式系统工程设计概述
查看>>
Vector3.forward
查看>>
ubuntu-学习笔记之1-9
查看>>
8086汇编语言(1)虚拟机安装ms-dos 7.1
查看>>
C#多线程编程之:lock使用注意事项
查看>>
DI,DIP,IOC的演变历史 <转>
查看>>
oracle extract()截取时间值函数
查看>>
[安卓] 10、悬浮窗与获取其他任务信息
查看>>
JDOM入门实例:读取与创建xml文档
查看>>
Knockout 新版应用开发教程之"text"绑定
查看>>
Android 分享微信好友 朋友圈
查看>>
java内存分配研究
查看>>
第 25 章 Munin
查看>>
【iOS】在Swift中使用JSONModel
查看>>