HarmonyOS开发实战:小分享-使用hilog实现Ability生命周期日志埋点
前言在生产环境中App 的启动崩溃、页面跳转失败等问题往往只能靠日志排查。HarmonyOS 提供了hilog日志系统支持分级、过滤、脱敏。本篇以小分享 App 的EntryAbility为例演示如何用hilog建立规范的日志埋点体系。详细 API 可参考 HarmonyOS hilog 官方文档。一、hilog 的导入与初始化1.1 导入语句小分享 App 的EntryAbility.ets开头如下import { hilog } from kit.PerformanceAnalysisKit; const DOMAIN 0x0000;1.2 关键点说明关键点说明如下hilog位于kit.PerformanceAnalysisKit套件中按需导入即可DOMAIN是日志域标识通常用 16 进制整数取值范围0x0000 ~ 0xFFFF一个 App 内不同模块可以定义不同的DOMAIN便于过滤二、hilog 的五个 API2.1 API 列表HarmonyOS 提供了五个hilogAPI分别对应不同的日志级别API级别典型场景hilog.debugD开发调试发布版本会被过滤hilog.infoI关键流程节点hilog.warnW可恢复的异常hilog.errorE不可恢复的异常hilog.fatalF致命错误会导致进程退出2.2 小分享 App 的使用小分享 App 主要使用info和errorhilog.info(DOMAIN, testTag, %{public}s, Ability onCreate); hilog.error(DOMAIN, testTag, Failed to set colorMode. Cause: %{public}s, JSON.stringify(err));三、format 字符串与脱敏3.1 隐私修饰符hilog的format参数遵循 C 风格占位符但增加了隐私修饰符修饰符含义适用场景%{public}s明文输出调试信息、状态描述%{private}s自动脱敏显示为 ***用户 ID、手机号、Token%{public}d明文整型计数器、版本号3.2 正确示例正确示例代码如下hilog.info(DOMAIN, LoginTag, userId: %{private}s, loginCount: %{public}d, userId, count);输出形如userId: *** , loginCount: 53.3 错误示例错误示例代码如下hilog.info(DOMAIN, LoginTag, userId: userId); // ❌ 字符串拼接绕过脱敏提示字符串拼接会绕过脱敏机制造成敏感信息泄漏必须使用占位符格式化。四、为生命周期埋点4.1 完整埋点代码小分享 App 在每个生命周期回调中都打了日志便于还原执行时序onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { try { this.context.getApplicationContext().setColorMode( ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET ); } catch (err) { hilog.error(DOMAIN, testTag, Failed to set colorMode: %{public}s, JSON.stringify(err)); } hilog.info(DOMAIN, testTag, %{public}s, Ability onCreate); } onWindowStageCreate(windowStage: window.WindowStage): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onWindowStageCreate); windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, testTag, Failed to load: %{public}s, JSON.stringify(err)); return; } hilog.info(DOMAIN, testTag, %{public}s, Succeeded in loading the content.); }); } onForeground(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onForeground); } onBackground(): void { hilog.info(DOMAIN, testTag, %{public}s, Ability onBackground); }4.2 埋点策略小分享 App 的埋点策略如下每个 Ability 生命周期回调都打info级日志异常分支打error级日志启动耗时通过info时间戳推算关键业务节点如分享成功打info日志五、查看日志5.1 方式 1DevEco Studio HiLog 面板DevEco Studio 底部的HiLog面板支持按 tag、domain、级别过滤。这是开发阶段最常用的查看方式。5.2 方式 2hdc 命令行通过hdc命令行可以查看设备日志hdc shell hilog -T testTag -L I参数说明如下-T按 tag 过滤-L按级别过滤D/I/W/E/F-D按 domain 过滤5.3 方式 3保存到文件通过以下命令可以将日志保存到设备文件hdc shell hilog -r hdc shell hilog -w start -t 30六、hilog 最佳实践6.1 统一 tag 命名建议采用统一的 tag 命名规范AbilityTag - Ability 生命周期 RouterTag - 路由跳转 NetworkTag - 网络请求 DbTag - 数据库操作 UiTag - UI 渲染6.2 避免高频日志在ForEach循环中打info日志会迅速填满缓冲区建议改为debug或采样输出。6.3 务必捕获错误码异步回调中的err.code是排查问题的关键必须打印windowStage.loadContent(pages/Index, (err) { if (err.code) { hilog.error(DOMAIN, testTag, err.code: %{public}d, err.msg: %{public}s, err.code, JSON.stringify(err)); return; } });6.4 发布版本关闭 debug通过hilog.setLogLevel设置全局最低级别避免性能损耗hilog.setLogLevel(DOMAIN, hilog.LogLevel.WARN);七、本篇核心知识点7.1 hilog 核心 APIhilog 核心 API 总结如下hilog.debug/info/warn/error/fatal五个级别DOMAIN标识模块便于过滤tag标识调用方便于定位format用%{public}s/%{private}s控制脱敏7.2 实战开发要点实战开发中需要重点关注以下几个要点日志要在关键节点埋点便于还原执行时序敏感信息必须使用%{private}s脱敏发布版本应关闭debug级日志异步回调的错误码必须打印总结本文详细讲解了 HarmonyOS hilog 日志系统的使用方法结合小分享 App 的EntryAbility生命周期埋点演示了日志分级、脱敏、查看的完整流程。下一篇我们将深入module.json5这个模块级配置文件解析入口 Ability 声明的每个字段。附录完整实现细节1. 核心 API 参考API作用说明本文涉及的核心 API功能实现参见华为官方文档2. 完整代码示例// 核心功能代码 // 详见正文中的完整实现3. 常见问题排查问题原因解决方案编译错误import 路径错误检查路径和 API 版本运行时异常参数不合法使用 try/catch 捕获性能问题主线程耗时操作使用异步 API4. 最佳实践错误处理完善使用 try/catch 包裹资源及时释放避免内存泄漏异步操作使用 async/await权限配置完整按需申请5. 完整代码文件索引文件路径说明本文涉及的代码文件见正文6. 实现要点总结核心实现要点API 的正确使用方法和参数说明完整的代码实现流程常见问题的排查方案性能优化和安全建议7. 总结本文详细讲解了小分享 App 中对应功能的完整实现。通过本文的学习读者可以掌握 HarmonyOS 开发的核心 API 使用方法和最佳实践。开发注意事项1. API 版本兼容性确保使用的 API 在目标 SDK 版本中可用。不同版本的 HarmonyOS 可能对 API 的支持有所不同建议查阅官方文档确认。2. 权限配置根据功能需求配置相应的系统权限。权限在 module.json5 中声明运行时通过 abilityAccessCtrl 申请。3. 错误处理所有异步操作使用 try/catch 包裹确保异常不会导致应用崩溃。错误信息通过 hilog 输出便于调试。4. 资源释放使用完毕后及时释放系统资源避免内存泄漏。例如文件操作后关闭文件句柄数据库操作后关闭 ResultSet。5. 性能优化避免在主线程执行耗时操作使用异步 API 处理耗时任务。大量数据渲染时使用 LazyForEach 懒加载。完整代码文件索引文件路径说明本文涉及的代码文件见正文核心 API 参考API/组件用途文档链接文中涉及的 API核心功能华为官方文档总结本文详细讲解了小分享 App 中对应功能的完整实现涵盖 API 使用、代码示例、常见问题、性能优化等核心知识点。通过本文的学习读者可以掌握 HarmonyOS 开发的完整流程。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力

相关新闻

SECDED ECC原理与FMC诊断模式在功能安全系统中的应用

SECDED ECC原理与FMC诊断模式在功能安全系统中的应用

1. 项目概述:SECDED ECC与FMC诊断模式深度解析在嵌入式系统,尤其是汽车电子和工业控制领域,数据的完整性就是系统的生命线。想象一下,一辆高速行驶的汽车,其发动机控制单元(ECU)的Flash存储器中…

2026/9/23 22:01:28 阅读更多 →
尼康D7500套机评测:APS-C画幅单反的平衡之道与实战指南

尼康D7500套机评测:APS-C画幅单反的平衡之道与实战指南

1. 先搞清楚 D7500 套机到底适合谁,不适合谁如果你正在看中端单反,预算在 8000 到 10000 元,想找一个能拍照片、偶尔录视频、镜头覆盖日常焦段的套机,尼康 D7500 配 18-140mm 这款组合确实值得重点考虑。但如果你指望它干专业视频…

2026/10/2 9:58:37 阅读更多 →
机房共建模式解析:盈利结构与成本优化策略

机房共建模式解析:盈利结构与成本优化策略

1. 机房共建模式的商业本质机房共建本质上是一种资源整合的轻资产运营模式。不同于传统IDC企业自建机房的"重资产"路线,共建模式通过多方协作实现资源最优配置。我接触过的几个典型案例中,常见的是由场地提供方(如产业园区&#xf…

2026/10/1 16:14:24 阅读更多 →

最新新闻

Javaweb物流管理系统实战:从运行配置到数据库设计全解析

Javaweb物流管理系统实战:从运行配置到数据库设计全解析

简介:这是一份基于JavaWeb技术栈的物流管理系统完整项目资料,面向初、中级Java开发者和毕业设计/课程设计人群,覆盖订单管理、仓储管理、配送跟踪等核心业务。压缩包共717个文件,包含Java源码、JSP页面、SQL数据库脚本、XML配置以…

2026/10/5 14:27:56 阅读更多 →
企业技术支持RAG与Agent实战:无Token可用,有Token更聪明

企业技术支持RAG与Agent实战:无Token可用,有Token更聪明

1. 企业技术支持 Agent 的 RAG 实战拆解 1.1 这个项目到底在做什么 企业技术支持这个场景,做过的人都懂——每天面对的是海量重复问题、产品文档、历史工单、FAQ、内部 Wiki,还有一堆散落在聊天记录里的“民间解决方案”。新人上手慢,老人被…

2026/10/5 14:27:56 阅读更多 →
用LLM驱动马里奥:实时游戏Agent的架构与调试实录

用LLM驱动马里奥:实时游戏Agent的架构与调试实录

拿起"LLMario"这个名字的时候,我脑子里先冒出来的是Nintendo标志性的红帽子水管工,紧接着才意识到后面跟的是Large Language Model。一个纯粹用大语言模型驱动游戏角色、让它在一个实时模拟器环境里自己观察、自己决策、自己按手柄的项目&…

2026/10/5 14:27:56 阅读更多 →
Windows下dlib安装全指南:从C++编译环境到人脸检测实战

Windows下dlib安装全指南:从C++编译环境到人脸检测实战

1. 先从原理说起:dlib为什么装起来这么费劲 先说结论:Windows 上装 dlib 本身不难,难的是你缺了一整套 C 编译环境。很多人卡在 pip install dlib 上,看着终端刷了大半屏的 Building wheel for dlib 然后报红,第一…

2026/10/5 14:27:56 阅读更多 →
压力变送器嵌入式C程序设计:硬件耦合与工业可靠性实战

压力变送器嵌入式C程序设计:硬件耦合与工业可靠性实战

1. 项目概述:为什么一个压力变送器的C语言程序,值得花三天时间重写三次?你手上正拿着一块刚焊好的STC12C5A60S2最小系统板,旁边是两根红黑线连着的扩散硅压力传感器,示波器上跳动着不稳定的AD采样波形——这场景我太熟…

2026/10/5 14:27:56 阅读更多 →
隔离内网下AI Agent工程化实战:MCP与Skills架构落地

隔离内网下AI Agent工程化实战:MCP与Skills架构落地

1. 为什么“隔离内网”是 AI Agent 工程化的真正分水岭很多人第一次听到“隔离内网下跑 AI Agent”,第一反应是:不就是把模型换成本地部署、把网络请求掐掉吗?真做过一轮的人都知道,事情远没有这么简单。隔离内网意味着你面对的不…

2026/10/5 14:26:55 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →