Java(day177):还在手动 Log.e?你是上个世纪的程序员吗!”——LogUtils 日志工具类封装终极指南

七千22

关注

阅读 22

07-22 09:00

大家好,我是不熬夜崽崽!大家如果觉得看了本文有帮助的话,麻烦给不熬夜崽崽点个三连(点赞、收藏、关注)支持一下哈,大家的支持就是我写作的无限动力。

前言

  朋友们,程序写得再好,不打点日志,那真的是“裸奔开发”啊!别说查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?写代码不打日志,那跟摸黑走夜路有啥区别?😉

精彩评论(0)

0 0 举报