HarmonyOS 7 ArkWeb 日志筛选突然漏了 Warn?API 26 的 MessageLevel 数值变更别写死
HarmonyOS 7 ArkWeb 日志筛选突然漏了 Warn?API 26 的 MessageLevel 数值变更别写死
Web 页面还在正常调用 console.warn(),应用侧的告警面板却安静了;反过来,调试日志又被当成重要消息收上来。遇到这种情况,先别急着怀疑 ArkWeb 没收到消息,检查一下 onConsole 里是不是直接比较了 1、4 这样的数字。
华为的 HarmonyOS 7 / API 26 ArkWeb 差异表列出了 MessageLevel 枚举值的变化。ConsoleMessage.getMessageLevel() 返回的是枚举级别;枚举名字仍是你表达语义的入口,数字不是跨版本的稳定业务协议。

本文对比的是华为 2026-09-04 更新的 API 26 差异表中明确列出的四项。当前本机没有 API 26 SDK,后面的 Node 模型测试已经运行,但没有伪装成 Web 组件真机回调截图。示例用于排查 HarmonyOS 7 应用适配,实际包仍应在目标 SDK 和设备上验证。
一张表看出旧判断为什么会错
| 枚举名 | API 26 前的数值 | API 26 差异表中的新数值 | 旧代码若按数字判断 |
|---|---|---|---|
Debug | 0 | 1 | === 1 会把 Debug 误判为旧 Error |
Error | 1 | 4 | === 1 再也筛不到 Error |
Warn | 4 | 3 | === 4 再也筛不到 Warn |
Log | 3 | 5 | 注意 API 26 中此枚举也被标记为弃用变更 |
这不是排序顺序小改动。日志级别如果被写进埋点、过滤器或远端告警的数字字段,升级后的影响会跨出 Web 组件本身。先找到数值被消费的地方,再决定是否需要迁移历史数据,不要只改 UI 上那一行 if。
案例一:错误级别 1 变成调试级别
老代码常见写法:
const level = event.message.getMessageLevel();
if (level === 1) {
reportWebError(event.message.getMessage());
}
在旧映射里,1 是 Error;按 API 26 差异表的新映射,1 是 Debug,Error 变成 4。若继续这么写,问题不只是“漏报错误”,还有把调试输出送进错误通道、污染告警统计。
复现方法:用一段网页分别打印 console.debug('d') 与 console.error('e'),在 onConsole 中把收到的级别原值和消息文本一起记录。设备侧比较旧、新版本实际回调;本地不具备 API 26 环境时,可以先用下面的模型测试证明旧比较式的分类结果会变,但不能把它当成真机结果。
案例二:只收 Warn/Error 的白名单在新版本反了
另一类代码把 1 和 4 写进白名单:
const important = level === 1 || level === 4;
旧映射下它恰好是 Error 和 Warn;新映射下它变成 Debug 和 Error,Warn 的新值 3 被漏掉。这个问题比较隐蔽:错误依然有一部分能进告警,所以日常看面板会以为采集没断,只有警告类消息突然消失。
在 Web 的 onConsole 回调里,应该按当前 SDK 暴露的枚举名判断,而不是持久化一个“我记得等于几”的数字:
// 放在 Web 组件的 onConsole 回调中;按当前 SDK 的 MessageLevel 枚举编译。
const level = event.message.getMessageLevel();
const keep = level === MessageLevel.Warn || level === MessageLevel.Error;
if (keep) {
console.info('Web message: ' + event.message.getMessage());
}
return false;
这里 return false 是为了让原控制台打印行为继续存在;是否需要截断控制台输出,应按应用自己的日志策略决定。上面的片段只展示分类逻辑,不是未经编译就能保证适配任何工程的完整页面文件。
本地跑一个最小迁移测试
为了把“数字错位”从感觉变成可见结果,我用两张映射表跑同一条过滤规则:
const before26 = { Debug: 0, Error: 1, Log: 3, Warn: 4 };
const api26 = { Debug: 1, Error: 4, Log: 5, Warn: 3 };
const oldFilter = raw => raw === 1 || raw === 4;
const namedFilter = (raw, levels) =>
raw === levels.Error || raw === levels.Warn;
for (const levels of [before26, api26]) {
console.log('Warn', oldFilter(levels.Warn), namedFilter(levels.Warn, levels));
console.log('Error', oldFilter(levels.Error), namedFilter(levels.Error, levels));
console.log('Debug', oldFilter(levels.Debug), namedFilter(levels.Debug, levels));
}
本机结果:三组自动化测试通过,覆盖旧值下的正确行为、API 26 新值下 Debug/Warn 的误判,以及按枚举语义筛选在两组映射下的一致性。它验证的是过滤逻辑,不是 ArkWeb 内核回调。实际工程还要在目标设备上用 console.debug/warn/error 各打一条,并检查日志管道、埋点字段和服务端分类是否都按名字解释。
如果日志数据已经把旧数字存进数据库或上传到服务端,不能直接把历史 1 全部改读作 Debug。至少给数据加上“产生时的 API/映射版本”,按版本翻译,再展示统一的语义级别。这比仅修当前页面的过滤器更稳,也避免历史趋势图被新旧数字混淆。
官方资料
更多推荐



所有评论(0)