超高逼格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大师代发,拒绝转载,转载需要作者授权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?