超高逼格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程 ...
随机推荐
- OpenGL入门学习(四)
http://blog.csdn.net/sun6255028/article/details/5090055 OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式.无论哪种颜色模式,计算 ...
- linux 路由表设置 之 route 指令详解【转】
转自:http://blog.csdn.net/vevenlcf/article/details/48026965 目录(?)[-] 种路由类型 主机路由 网络路由 默认路由 配置静态路由 route ...
- Appium+python自动化10-AVD 模拟器【转载】
前言 有些小伙伴没android手机,这时候可以在电脑上开个模拟器玩玩 一.模拟器配置 1.双击启动AVD Manager,进入配置界面
- SQL 并发-转
脏读.不可重复读 共享锁.悲观锁 和 事务五种隔离级别 一.脏读.不可重复读.幻读1.脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个 ...
- (1)IIS
1.选择控制面板-程序和功能 2.点击左侧“打开或关闭Windows功能 3.internet信息服务下的文件夹全勾 4.安装完成后,选择管理工具 5.选择IIS管理器 6.显示如下
- Gym - 101194F(后缀数组)
Mr. Panda and Fantastic Beasts 题意 给出若干个字符串,找到一个最短的字典序最小的字符串且仅是第一个字符串的子串. 分析 对于这种多个字符串.重复的子串问题一般都要连接字 ...
- 分享Kali Linux 2017年第24周镜像文件
分享Kali Linux 2017年第24周镜像文件 Kali Linux官方于6月11日发布2017年的第24周镜像.这次维持了11个镜像文件的规模.默认的Gnome桌面的4个镜像,E17.KD ...
- 加强版dd工具dc3dd
加强版dd工具dc3dd dd是Linux最常用的磁盘备份工具,但缺少渗透测试常用的数据校验.hash等重要功能.Kali Linux提供的一款专用工具dc3dd.该工具是dd的加强版.它在dd的 ...
- hdu 5206 Four Inages Strategy 计算几何
题目链接:HDU - 5206 Young F found a secret record which inherited from ancient times in ancestral home b ...
- OVF? OVA? VMDK? – File Formats and Tools for Virtualization
I recently worked on a project to create a “virtual appliance” for one of our customers. They have a ...