超高逼格Log日志打印
前言
Log日志的打印一直是一个比较头疼的事,怎样才能让自己的log显示更多信息,怎样才能让自己的log更好的帮助我们定位问题,帮助调试,一直是我关注的问题。
我将Log打印封装到LogUtil类中,这篇文章涉及以下内容
- LogUtil的优势
 - LogUtil的实现原理
 - LogUtil的使用
 - 项目结构图和效果图
 
一. LogUtil的优势
LogUtil打印封装类,其有以下优点:
- 显示当前项目的包名
 - 显示当前日志级别
 - 显示tag
 - 显示log所在类的类名
 - 显示log调用处所在的方法名
 - 显示log所在的行数
 - 点击行数定位到具体代码处
 
二. 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类似下面这样:

里面包含包名,日志级别,tag,类名,方法名和log的行数
四. 项目结构图和效果图
项目结构截图

运行效果图

超高逼格Log日志打印
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
超高逼格Log日志打印的更多相关文章
- android的Log日志打印管理工具类(一)
		
android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...
 - Java编码常见的Log日志打印问题
		
前言 本文总结了作者在Java代码检视中遇到的一些关于日志打印的问题,并给出修改建议.因能力有限,难免存在错漏,欢迎指正. 一. 不规范的异常打印 使用slf4j日志组件时,logger.error( ...
 - Javascript 将 console.log 日志打印到 html 页面中
		
如何将 console.log() 打印的日志输出到 html 页面中 (function () { var old = console.log; var logger = document.getE ...
 - 树莓派   log  日志 打印到 TXT
		
#include<stdio.h> #include <stdarg.h> #include <unistd.h> #include <stdint.h> ...
 - Junit测试打印详细的log日志,可以看到sql
		
Junit测试打印详细的log日志,可以看到sql 在log4j.xml的日志配置文件中,把日志级别从info级别调整到debug级别: <?xml version="1.0" ...
 - log日志中不打印异常栈的具体信息
		
问题与分析 最近在查项目的log时发现报了大量的NPE(NullPointerException),诡异的是只log了Exception的类名,却没有具体的堆栈信息,以致于无法对该NPE异常进行准确定 ...
 - rest-assured 将log()中的信息打印到log日志中去的方法
		
rest-assured 将log()中的信息打印到log日志中去的方法: ============方法1============== PrintStream fileOutPutStream = n ...
 - android 华为、魅族手机无法打印 Log 日志的问题
		
最近使用魅族真机测试 App 时,发现 LogCat 不显示项目工程中通过Log.d()和Log.v()打印的 debug 和 verbose 级别的日志,甚是奇怪,通过 debug 模式断点调试也没 ...
 - Xposed框架Hook Android应用的所有类方法打印Log日志
		
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80954759 在进行Android程序的逆向分析的时候,经常需要Android程 ...
 
随机推荐
- HTML5 canvas上画文字出现乱码
			
不是这个的问题, <html> <head> <meta charset="utf-8"/> </head> 是因为从网上复制粘贴下 ...
 - python mysql创建表
			
表设计 表:student 字段名 类型 是否为空 主键 描述 StdID int 否 是 学生ID StdName varchar(100) 否 学生姓名 Gender enum('M','F') ...
 - bash shell 文本文件操作
			
一.打开文本文档,查看文本的内容,我们最直观的方式就是用编辑器,并且可以使用vi内部的查找命令查找[参见Vim文字编辑] vi test.txt#使用vi打开当前目录下的test.txt文本 二.总结 ...
 - 使用windos电脑模拟搭建集群(三)实现全网监控
			
这里我们采用小米监控 open-falcon 这是server端就是 192.168.5.200 这台主机, agent就是负责将数据提交到 server端 agent整个集群所有主机都 ...
 - 错误整理:容器启动报错com.sun.faces.config.WebConfiguration cannot be cast to com.sun.faces.config....
			
错误集锦: 今天用Jboss部署一个web项目的时候报了个奇怪的错误(用Tomcat部署运行良好),错误信息如下:java.lang.ClassCastException: com.sun.faces ...
 - Codeforces Round #267 (Div. 2) B. Fedor and New Game【位运算/给你m+1个数让你判断所给数的二进制形式与第m+1个数不相同的位数是不是小于等于k,是的话就累计起来】
			
After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play ...
 - 树的直径【bzoj3363】 [Usaco2004 Feb]Cow Marathon 奶牛马拉松
			
Description 最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松.马拉松路线要尽量长,所以,告诉你农场的地图(该地图的描述与上题一致),请帮助约翰寻找两个最远农场间的 ...
 - 【bzoj1562】【[NOI2009]变换序列】匈牙利算法的性质利用
			
(上不了p站我要死了,侵权度娘背锅) Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30 ...
 - Android Developer -- Bluetooth篇 概述
			
Bluetooth 安卓平台支持蓝牙网络协议栈,它允许设备与其他蓝牙设备进行无线交换数据.应用程序框架通过安卓蓝牙APIs提供访问蓝牙功能.这些APIs使应用程序通过无线连接到其他蓝牙设备,使点对点和 ...
 - 在java代码中设置margin
			
我们平常可以直接在xml里设置margin,如: <ImageView android:layout_margin="5dip" android:src="@dra ...