2. HiLog 基础使用:接口介绍与日志级别
好,咱们直接进入正题。HiLog 是鸿蒙系统自带的日志工具,说白了就是你在开发时用来“喊话”的东西——把程序运行时的关键信息打印出来,方便你排查问题。
我个人习惯把 HiLog 比作“开发者的听诊器”。你想想看,代码跑起来之后,内部发生了什么?变量值对不对?流程走没走到?这些你肉眼看不到,但 HiLog 能帮你“听”出来。
2.1 核心接口:三个最常用的方法
HiLog 提供了三个最基础的日志输出接口,分别是 HiLog.info、HiLog.debug 和 HiLog.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 的日志级别分为 DEBUG、INFO、WARN、ERROR、FATAL 五个等级。咱们课程里重点讲前三个,因为日常开发中用到最多。
| 级别 | 对应接口 | 典型使用场景 |
|---|---|---|
| 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 的三个核心接口:
info、debug、error,分别对应不同的日志级别。 - 日志级别从低到高:DEBUG < INFO < ERROR,每个级别有各自的用途。
- 标签定义要规范、统一,方便后续过滤和排查。
下一节咱们会讲如何配置 HiLog 的日志输出格式,以及如何在命令行中过滤日志。到时候我会分享一些我平时调试时常用的“骚操作”,保证让你效率翻倍。