2. HiLog 基础使用:接口介绍与日志级别

好,咱们直接进入正题。HiLog 是鸿蒙系统自带的日志工具,说白了就是你在开发时用来“喊话”的东西——把程序运行时的关键信息打印出来,方便你排查问题。

我个人习惯把 HiLog 比作“开发者的听诊器”。你想想看,代码跑起来之后,内部发生了什么?变量值对不对?流程走没走到?这些你肉眼看不到,但 HiLog 能帮你“听”出来。

2.1 核心接口:三个最常用的方法

HiLog 提供了三个最基础的日志输出接口,分别是 HiLog.infoHiLog.debugHiLog.error。它们的使用方式非常相似,但语义不同。

接口签名(简化版):

HiLog.info(label, format, ...args);
HiLog.debug(label, format, ...args);
HiLog.error(label, format, ...args);

每个接口都接受三个参数:

  • label:日志标签,用于标识这条日志来自哪个模块或类。我一般用类名或功能模块名,比如 "MainAbility""NetworkModule"
  • format:日志内容的格式化字符串,支持 %s%d 等占位符。
  • ...args:可变参数,对应 format 中的占位符。

举个例子,你一看就明白:

HiLog.info("MainAbility", "用户点击了登录按钮,当前状态:%s", "已登录");
HiLog.debug("NetworkModule", "请求耗时:%d ms", 230);
HiLog.error("DataManager", "数据解析失败,错误码:%d", -1);

嗯,这里要注意:format 字符串中的占位符数量和 args 参数数量必须一一对应,否则日志会打印出奇怪的内容。我在项目中遇到过好几次这种低级错误,排查了半天才发现是参数没对齐。

2.2 日志级别:从低到高,各有用途

HiLog 的日志级别分为 DEBUGINFOWARNERRORFATAL 五个等级。咱们课程里重点讲前三个,因为日常开发中用到最多。

级别 对应接口 典型使用场景
DEBUG HiLog.debug() 开发调试时打印的详细信息,比如变量值、循环次数、临时计算结果。发布版本建议关闭。
INFO HiLog.info() 记录程序正常运行的关键节点,比如页面加载完成、用户操作成功、网络请求发出。
ERROR HiLog.error() 记录程序运行中出现的错误,比如网络超时、数据解析失败、空指针异常。

我的个人经验:DEBUG 级别的日志我习惯写得特别详细,甚至会把每个函数的入口和出口都打上日志。这样一旦出问题,我直接看日志就能知道程序走到哪一步了,不用再去猜。但发布版本一定要关掉 DEBUG 日志,否则性能会受影响。

2.3 标签定义:给你的日志起个好名字

标签(label)是 HiLog 中非常重要的概念。它就像日志的“身份证”,告诉你这条日志来自哪个模块。

我建议你遵循以下原则来定义标签:

  • 使用模块名或类名:比如 "LoginPage""HttpClient""DatabaseHelper"
  • 保持一致性:同一个模块的所有日志使用相同的标签,方便过滤。
  • 不要过长:标签太长会影响阅读效率,一般不超过 20 个字符。

举个例子,假设你有一个网络请求模块,可以这样定义:

// 在模块顶部定义一个常量
private static final String TAG = "HttpClient";

// 然后统一使用这个标签
HiLog.info(TAG, "开始请求,URL:%s", url);
HiLog.debug(TAG, "请求参数:%s", params.toString());
HiLog.error(TAG, "请求失败,错误信息:%s", error.getMessage());

避坑指南:我曾经在一个项目中看到同事把标签写成了 "HttpClient""httpClient" 两种形式,大小写不一致。结果在日志过滤时,明明有日志却搜不到,折腾了半天才发现是标签大小写的问题。所以,标签的大小写一定要统一,最好全部用驼峰命名。

2.4 实际使用:一个完整的例子

咱们来看一个完整的例子,模拟一个用户登录的场景:

public class LoginManager {
    private static final String TAG = "LoginManager";

    public void login(String username, String password) {
        HiLog.info(TAG, "开始登录流程,用户名:%s", username);

        // 参数校验
        if (username == null || password == null) {
            HiLog.error(TAG, "登录参数为空,用户名:%s,密码:%s", username, password);
            return;
        }

        // 模拟网络请求
        HiLog.debug(TAG, "发送登录请求,参数已校验通过");
        boolean success = doNetworkRequest(username, password);

        if (success) {
            HiLog.info(TAG, "登录成功,用户名:%s", username);
        } else {
            HiLog.error(TAG, "登录失败,用户名:%s,密码长度:%d", username, password.length());
        }
    }

    private boolean doNetworkRequest(String username, String password) {
        // 模拟网络请求耗时
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            HiLog.error(TAG, "网络请求被中断,异常信息:%s", e.getMessage());
        }
        return true;
    }
}

你看,通过不同级别的日志,你可以清晰地看到程序的执行流程:

  • INFO 日志告诉你“开始登录”和“登录成功”这两个关键节点。
  • DEBUG 日志告诉你“参数校验通过”和“发送请求”这些中间步骤。
  • ERROR 日志告诉你“参数为空”和“登录失败”这些异常情况。

这样一旦出问题,你打开日志一看,就能快速定位到是哪个环节出了岔子。

2.5 小结

好了,这一节的内容就这些。总结一下:

  • HiLog 的三个核心接口:infodebugerror,分别对应不同的日志级别。
  • 日志级别从低到高:DEBUG < INFO < ERROR,每个级别有各自的用途。
  • 标签定义要规范、统一,方便后续过滤和排查。

下一节咱们会讲如何配置 HiLog 的日志输出格式,以及如何在命令行中过滤日志。到时候我会分享一些我平时调试时常用的“骚操作”,保证让你效率翻倍。