一、鸿蒙日志系统概述:HiLog基本概念
做鸿蒙开发,日志系统是你每天都要打交道的工具。说实话,没有日志,调试就像蒙着眼睛走路。
HiLog 是鸿蒙系统原生的日志框架。我刚开始接触时,觉得它跟 Android 的 Logcat 差不多。但用久了才发现,它设计得更精细,尤其是在分布式场景下,能帮你快速定位问题。
HiLog 的核心,说白了就是一套结构化的日志输出规范。它不光告诉你「发生了什么」,还告诉你「发生在哪个模块」「严重到什么程度」。我个人习惯把 HiLog 看作系统的「黑匣子」—— 每次崩溃、每次异常,都能从这里找到线索。
HiLog 的特点:
- 轻量级:性能开销极低,生产环境也能用
- 结构化:每条日志都带领域标识、标签、时间戳
- 分布式:支持跨设备日志聚合
二、日志级别:从 DEBUG 到 FATAL
日志级别是 HiLog 最基础的概念。你想想看,如果所有日志都混在一起,你根本分不清哪些是调试信息,哪些是致命错误。
HiLog 定义了 5 个级别,从低到高分别是:
| 级别 | 常量 | 含义 | 我的使用习惯 |
|---|---|---|---|
| DEBUG | LOG_DEBUG | 调试信息,开发阶段使用 | 变量值、流程分支、临时打印 |
| INFO | LOG_INFO | 普通信息,记录关键流程 | 启动完成、网络连接、页面跳转 |
| WARN | LOG_WARN | 警告,可能存在问题 | API 废弃、配置缺失、降级处理 |
| ERROR | LOG_ERROR | 错误,功能受影响 | 网络超时、数据解析失败、权限拒绝 |
| FATAL | LOG_FATAL | 致命错误,进程将终止 | 空指针、内存溢出、核心服务崩溃 |
嗯,这里要注意:FATAL 级别的日志一旦输出,系统会直接终止当前进程。我在项目中遇到过一位同事,调试时随手打了个 LOG_FATAL,结果每次跑到那行代码就闪退,排查了半天才发现是日志级别设错了。所以,FATAL 一定要慎用。
避坑指南:我曾经在生产环境的 release 包中见过有人保留 DEBUG 日志。结果日志量暴增,磁盘写满,应用卡死。建议用 HiLog 的条件编译宏,在 release 包中自动过滤 DEBUG 级别。
三、日志分类与领域标识
这是 HiLog 区别于其他日志系统的一大亮点。它引入了「领域标识」(Domain)的概念。
为什么要这么做?你想想看,一个鸿蒙应用可能涉及 UI、网络、数据库、传感器等多个模块。如果没有领域标识,所有日志混在一起,你根本分不清哪条是哪个模块的。
HiLog 的领域标识是一个 32 位的整数,系统预定义了一些常用领域:
| 领域常量 | 值 | 适用场景 |
|---|---|---|
| LOG_APP | 0x0001 | 应用通用日志 |
| LOG_UI | 0x0002 | UI 渲染、布局相关 |
| LOG_NET | 0x0003 | 网络请求、连接管理 |
| LOG_DB | 0x0004 | 数据库操作 |
| LOG_SENSOR | 0x0005 | 传感器数据 |
当然,你也可以自定义领域标识。我个人习惯为每个业务模块分配一个独立的 Domain,比如支付模块用 0x0100,地图模块用 0x0200。这样在日志工具中按 Domain 过滤,效率极高。
小技巧:领域标识配合 HiLog 的标签(Tag)一起使用,效果更好。Domain 区分模块,Tag 区分具体功能。比如 Domain=LOG_NET,Tag="HttpClient",一眼就知道是网络模块的 HTTP 客户端在打日志。
四、知识体系结构图
下面这张图,是我梳理的 HiLog 日志系统核心知识结构。你可以把它当作本章的「地图」:
五、代码示例:快速上手 HiLog
光说不练假把式。下面这段代码,展示了 HiLog 的基本用法:
import { hilog } from '@kit.PerformanceAnalysisKit';
// 定义领域标识
const DOMAIN_APP: number = 0x0001;
const DOMAIN_NET: number = 0x0003;
// 打印不同级别的日志
hilog.debug(DOMAIN_APP, "MainPage", "用户点击了登录按钮");
hilog.info(DOMAIN_APP, "MainPage", "登录请求已发送,用户ID: %{public}s", userId);
hilog.warn(DOMAIN_NET, "HttpClient", "请求超时,正在进行第2次重试");
hilog.error(DOMAIN_NET, "HttpClient", "网络连接失败,错误码: %{public}d", errorCode);
// FATAL 级别要极度谨慎使用
// hilog.fatal(DOMAIN_APP, "CrashHandler", "不可恢复的错误,进程即将退出");
个人经验:我习惯在 DEBUG 日志中打印关键变量的值,在 INFO 日志中记录业务流程的里程碑。这样线上出问题时,先看 INFO 日志了解整体流程,再根据时间戳去查 DEBUG 日志的细节,效率非常高。
好了,以上就是 HiLog 日志系统的核心概念。记住三个关键词:级别、分类、领域标识。搞懂它们,你就掌握了鸿蒙日志调试的「入场券」。
公众号:蓝海资料掘金营,微信deep3321