一、鸿蒙日志系统概述: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 基本概念 三大核心要素 日志级别 日志分类 领域标识 DEBUG INFO WARN ERROR FATAL 应用日志 系统日志 安全日志 性能日志 LOG_APP LOG_UI LOG_NET LOG_DB 自定义 三者配合使用,实现精准的日志定位

五、代码示例:快速上手 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