news 2026/8/2 3:07:08

HarmonyOS应用实战-启示散页-69-hilog 别记录用户正文:用事件码保留排障线索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS应用实战-启示散页-69-hilog 别记录用户正文:用事件码保留排障线索

HarmonyOS 应用实战 69:hilog 别记录用户正文,用事件码保留排障线索

开发时在 hilog 打出 question 和 answerText 很方便,但答案之书的用户问题、题库和答案都可能是私人内容。日志一旦被截图、导出或附在反馈里,正文就离开了设备。

本文解决四个问题:

  1. 用事件码替代用户正文
  2. 只记录安全 id、长度、数量和阶段
  3. 把日志格式集中管理
  4. 验证发布态不会输出题库全文


日志不是业务备份

日志的目标是定位阶段,不是复原用户内容。能用长度、计数、hash、事件码说明的问题,就不要打印原文。

泄露链:hilog.info('question=%s', question) -> 用户反馈截图 -> 私人问题进入工单 -> 排障通道变成泄露通道

这篇和第 58 篇的边界不同:第 58 篇管用户可发送报告,第 69 篇管日志写入源头。日志本身不记录正文,导出时才不会被迫补救。

事件码先覆盖核心动作

事件码要稳定、可检索、可聚合。不要把自然语言错误散落在每个页面。

enumBookEventCode{StartupReady='STARTUP_READY',DrawCandidateEmpty='DRAW_CANDIDATE_EMPTY',FavoriteWriteFailed='FAVORITE_WRITE_FAILED',RouteParamInvalid='ROUTE_PARAM_INVALID'}

事件码要覆盖核心动作,而不是让每个页面写一段自然语言。稳定事件码才能被搜索、聚合和发布前审计。

日志参数只允许白名单字段

安全字段包括阶段、事件码、deckId hash、候选数量、文本长度。正文不进入日志输出格式。

interfaceSafeLogPayload{code:BookEventCode;deckHash?:string;qLen?:number;candidateCount?:number;errorCode?:string;}

白名单字段让日志保持可用:阶段、数量、长度、截断 id 可以定位故障,但不会还原用户问题。

BookLogger 统一输出格式

集中封装后,页面和服务不再直接拼 hilog 字符串。

classBookLogger{staticinfo(payload:SafeLogPayload):void{hilog.info(0x0001,'AnswerBook','code=%{public}s deck=%{public}s qLen=%{public}d count=%{public}d',payload.code,payload.deckHash??'-',payload.qLen??0,payload.candidateCount??0);}}

BookLogger集中格式后,业务代码不再直接拼hilog.info。后续要调整公开字段,也只改一个 owner。

抽取链路记录长度,不记录问题

问题长度可以帮助判断空输入、超长输入和是否来自推荐,但不需要知道问题内容。

classDrawDiagnostics{logDrawStart(deckId:string,question:string,candidateCount:number):void{BookLogger.info({code:candidateCount>0?BookEventCode.StartupReady:BookEventCode.DrawCandidateEmpty,deckHash:Hash.sha256(deckId).slice(0,12),qLen:question.trim().length,candidateCount});}}

抽取链路记录问题长度,不记录问题文本。长度足以区分空输入、超长输入和推荐入口,正文没有进入日志的必要。

发布前搜索敏感日志模式

不要只靠代码评审记忆。发布前用 rg 搜索常见危险字段和直接 hilog 调用。

rg-n"hilog\.(info|warn|error)|question|answerText|deckName|JSON.stringify"D:\ProgramData\huawei\lesson\The_Book_of_Answers

发布前搜索敏感日志模式,是为了发现新增代码绕开 logger。JSON.stringifyquestionTextanswerText都应该被重点看。

hilog 排查表

日志越详细不一定越好,能定位阶段且不泄露正文才是正确目标。

现象风险修复
日志含 answerText泄露答案改 answerId/hash
页面直接 hilog输出格式不可控统一 BookLogger
只有错误文本无事件码难检索增加 BookEventCode

如果日志里已经出现正文,先不要讨论导出报告怎么脱敏。源头日志改干净后,诊断导出才是真正安全的第二层。

先从源头禁止正文进入 hilog

第 58 篇解决“用户导出的报告怎么脱敏”,第 69 篇要往前一步:日志写入时就不接收正文。否则导出报告再安全,开发截图、临时附件和系统日志里仍可能出现敏感内容。

字段是否进入日志替代
questionTextqLen、事件码
answerTextanswerId的安全片段
deckNamedeckHash
候选数量candidateCount

这张白名单比“发布前记得删日志”可靠,因为它让业务代码没有传正文的入口。

发布前搜索要看直接调用和间接泄露

只搜hilog.info不够。JSON.stringify(deck)、错误对象拼接、临时console风格输出都可能把正文带进日志。发布前至少搜三类模式。

rg-n"hilog\.(debug|info|warn|error)"entry hsp har rg-n"questionText|answerText|deckName|JSON.stringify"entry hsp har rg-n"BookLogger\.info|BookLogger\.warn|BookLogger\.error"entry hsp har

第一条找直接日志调用,第二条找敏感字段,第三条确认是否走统一 logger。命中不是一定错误,但每个命中都要判断是否会输出用户正文。

交付记录要区分日志和诊断报告

日志治理和诊断导出是两层证据。日志层证明源头不写正文;报告层证明用户复制出去的内容也只包含白名单字段。两层缺一层,都不要写“排障材料已安全”。

证据证明
BookLogger白名单日志调用格式受控
敏感字段搜索记录新增代码没有绕过 logger
脱敏报告样例用户导出内容可发送
发布清单条目日志、诊断和隐私口径已对齐

这篇文章的结论应限定为“日志写入策略和本地静态审计方法”,没有设备hilog输出记录时,不写真机日志已验证。

日志事件码要能回到业务动作

事件码不是越多越好。每个事件码都应该能回到一个业务动作和一个排查入口。比如DRAW_CANDIDATE_EMPTY回到抽取候选集,ROUTE_PARAM_INVALID回到路由守卫,FAVORITE_WRITE_FAILED回到收藏仓储写入。

事件码业务动作第一排查点
DRAW_CANDIDATE_EMPTY抽取答案当前题库答案数量
ROUTE_PARAM_INVALID进入页面DrawingRouteGuard
FAVORITE_WRITE_FAILED收藏写入FavoriteRepository.saveAll
STARTUP_READY启动完成Preferences 与 AppStorage 水合

如果事件码不能指向排查点,它就只是另一种自然语言日志。第 69 篇要把“少打正文”和“仍能排障”同时讲清楚,否则读者会担心日志治理降低定位效率。

人工评审时抽一条日志反推定位能力

日志不记录正文以后,团队可能担心不好排障。最好的评审方式是随机抽一条安全日志,看它能否反推出下一步查哪里。

log: code=DRAW_CANDIDATE_EMPTY deck=ab12-cd34 qLen=6 count=0 下一步:查 deckHash 对应题库是否为空、候选过滤是否过严、当前 deckId 是否失效。 log: code=ROUTE_PARAM_INVALID deck=- qLen=0 count=0 下一步:查路由入口、参数构造和 DrawingRouteGuard。

如果一条日志既没有正文,又能指向排查入口,说明事件码设计是有效的。若日志去掉正文后完全无法定位,就不是隐私治理的问题,而是事件码和上下文字段设计太弱。

最后一项看调试开关是否进入发布态

日志治理还要检查临时调试开关。开发阶段可能会为了排查问题临时打开 verbose 日志,发布前必须确认这些开关不会让正文重新进入输出。建议把开关名、默认值和 release 行为写进发布清单:debug 包可以放宽事件数量,release 包仍然只允许白名单字段。这样日志策略不会因为一次临时排障被悄悄改坏。

开关debug 行为release 行为
verboseLog可增加事件数量仍禁正文
diagnosticsPreview可展示报告预览只展示脱敏字段

小结

hilog 要留下排障线索,但不能留下用户正文。事件码、阶段、长度、数量和 hash 已经足够定位多数问题;直接打印 question、answerText 和 deckName 应从发布态代码里移除。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/2 3:06:41

1.83英寸LCD驱动实战:从SPI接口到图形库集成全解析

1. 项目缘起:为什么是1.83英寸LCD? 最近在捣鼓一个需要显示交互信息的小玩意儿,比如智能家居的温湿度面板、便携设备的参数监视器,或者一个桌面小摆件。选屏幕的时候,我绕开了那些常见的0.96寸、1.3寸,直接…

作者头像 李华
网站建设 2026/8/2 3:05:57

Linux桌面自动化神器:AutoKey深度解析与实战指南

Linux桌面自动化神器:AutoKey深度解析与实战指南 【免费下载链接】autokey AutoKey, a desktop automation utility for Linux and X11. 项目地址: https://gitcode.com/gh_mirrors/au/autokey AutoKey是一款专为Linux和X11环境设计的桌面自动化工具&#xf…

作者头像 李华
网站建设 2026/8/2 3:05:26

瑞丰宝丽的AR系统能解决电力巡检作弊问题吗

在电力行业的数字化转型进程中,巡检数据的真实性一直是运维管理的痛点。传统的纸质记录或简单的移动端打卡,往往难以杜绝“假巡检”、“补录数据”以及“漏检关键点位”等作弊行为。随着增强现实(AR)技术与产业元宇宙概念的深度融…

作者头像 李华
网站建设 2026/8/2 3:01:05

STM32驱动2.4寸SPI LCD全攻略:从ILI9341基础到DMA帧缓冲优化

1. 项目概述:2.4英寸LCD模块的入门与核心价值最近在捣鼓一个基于STM32的小项目,需要一块显示清晰、驱动简单、性价比高的屏幕,于是2.4英寸的TFT LCD模块就成了我的首选。这类模块在创客圈、嵌入式开发和学生项目中非常流行,你几乎…

作者头像 李华
网站建设 2026/8/2 3:00:24

3分钟批量获取网易云和QQ音乐歌词:163MusicLyrics终极指南

3分钟批量获取网易云和QQ音乐歌词:163MusicLyrics终极指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 还在为音乐库里的无歌词歌曲烦恼吗?163…

作者头像 李华
网站建设 2026/8/2 2:58:08

CRC校验原理与实战:从通信故障到嵌入式实现

1. 项目概述:从一次通信故障说起前段时间,我接手了一个工业现场的数据采集项目,设备通过485总线定时上报传感器数据。调试初期一切顺利,但现场运行几天后,监控平台偶尔会收到一些“诡异”的数据,比如水温突…

作者头像 李华