大家好,我是不熬夜崽崽!大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。
前言
朋友们,程序写得再好,不打点日志,那真的是“裸奔开发”啊!别说查Bug了,连用户点了啥按钮你都不知道,是不是有点抓狂?
而更“可怕”的是,团队合作项目中,有人用Log.d()
,有人偏爱Log.e()
,还有人满屏System.out.println()
,你要统一格式还得跑去改几十个文件,简直堪比地狱级副本。有没有一种优雅的姿势,让我们的日志输出不仅美观统一、功能强大,还能支持异常封装、快速开关?当然有!那就是我们今天的主角——LogUtils
!
🧠为什么要封装一个日志工具类?
如果你还在想“直接用Log不是挺好吗?”那么你真的需要重新认识日志的重要性了。打日志不仅是为了“看到信息”,更是为了:
- 统一格式,便于搜索和归类
- 可以一键开关,发布版本轻松关闭日志
- 对异常进行标准化记录
- 为以后接入远程日志平台(如Bugly、Elk)做准备
- 开发和测试阶段方便排查问题
所以你会发现,写日志并不是一件“随手点一点”的事,它其实是一门“日志工程美学”!
📦 LogUtils 全封装设计思路
我们来看看这个日志工具类都能干点啥:
功能 | 说明 |
---|---|
日志开关 | 是否打印日志,一键控制 |
格式统一 | 输出日志信息包含:线程、类名、方法名、行号等 |
支持级别 | Verbose , Debug , Info , Warn , Error 全覆盖 |
异常日志封装 | 输出异常堆栈信息 |
自定义TAG | 自动生成或手动指定皆可 |
🔨 来点干货:LogUtils 代码实战
先直接贴代码!这可是我项目中亲测实用版本,简洁好用,代码注释齐全:
public class LogUtils {
private static final String DEFAULT_TAG = "LogUtils";
private static final boolean DEBUG = true; // 项目上线前可以改成 false
public static void v(String msg) {
if (DEBUG) Log.v(DEFAULT_TAG, buildMessage(msg));
}
public static void d(String msg) {
if (DEBUG) Log.d(DEFAULT_TAG, buildMessage(msg));
}
public static void i(String msg) {
if (DEBUG) Log.i(DEFAULT_TAG, buildMessage(msg));
}
public static void w(String msg) {
if (DEBUG) Log.w(DEFAULT_TAG, buildMessage(msg));
}
public static void e(String msg) {
if (DEBUG) Log.e(DEFAULT_TAG, buildMessage(msg));
}
public static void e(String msg, Throwable throwable) {
if (DEBUG) Log.e(DEFAULT_TAG, buildMessage(msg), throwable);
}
public static void custom(String tag, String msg) {
if (DEBUG) Log.d(tag, buildMessage(msg));
}
private static String buildMessage(String msg) {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
// 4是调用该方法的真正调用点
StackTraceElement element = stackTrace[4];
return String.format("[%s:%d %s()] ➤ %s",
element.getFileName(),
element.getLineNumber(),
element.getMethodName(),
msg);
}
}
🤯 细节拆解:每一行都不简单!
这不是单纯的封装 Log 方法那么简单,而是把信息最大化输出、错误日志堆栈友好呈现做到了极致。
🔍 buildMessage()
方法详解
你注意到没?我们不仅打印了日志,还能定位是从哪个文件、哪个方法、哪一行打出来的,简直比你老板催需求还精准!
输出示例:
[MainActivity.java:42 onCreate()] ➤ 初始化界面完毕
是不是比裸写Log.d("TAG", "msg")
好用一百倍?
🧨 异常封装也不能少!
来看这段异常日志输出:
try {
int a = 1 / 0;
} catch (Exception e) {
LogUtils.e("出现异常:", e);
}
输出:
[MainActivity.java:58 onCreate()] ➤ 出现异常:
java.lang.ArithmeticException: divide by zero
at com.xxx.MainActivity.onCreate(MainActivity.java:58)
...
简洁又专业,定位 Bug 一气呵成!哪像以前那种Exception.getMessage()
简直废话连篇还漏点关键。
🛡️ 发布时关闭日志只需一改!
上线版本不想打印日志怎么办?很简单,只要把:
private static final boolean DEBUG = true;
改成:
private static final boolean DEBUG = false;
瞬间安静如鸡,谁还看得出你项目里打了多少调试信息?
🔌 拓展建议:支持写入文件 or 上传日志服务器
如果你想进阶,可以考虑:
- 写日志到文件,便于后期离线排查问题
- 接入 Bugly、Sentry 等平台自动上传日志
- 加入日志级别过滤器,只输出 Error/Warn
🧠 总结一下吧兄弟!
LogUtils
不只是个“工具类”,它是你调试世界的瞭望塔,是你定位Bug的热成像仪。我们从统一格式到异常封装再到一键开关,一步步搭建出一个真正实用的日志框架。
还在满项目翻找 Log.d()
?那可真是“拿着锄头找矿石”了。别犹豫了,立马把这套LogUtils
加进你项目里,不谢!
💥尾声彩蛋:你项目里有多少行“野生Log”?
还不快把它们都替换成LogUtils
?写代码不打日志,那跟摸黑走夜路有啥区别?😉