为什么需要 HiLog
写鸿蒙应用,console.log 只能应付最简单的场景。要查崩溃、追状态、看链路,HiLog 才是正主:它是系统级日志框架,带分级、带过滤、带领域隔离,日志量大也不怕。
日志不是写给机器看的,是写给未来两小时后的你。
HiLog 走的是 ArkTS 的 hilog 模块,可以按 domain 和 tag 归类,按级别过滤,在 DevEco Studio 的 Log 窗口里还能着色高亮。这套体系养成了,排查问题的时间能省一大半。
HiLog 基础:domain 与级别
每个日志都带 domain(业务域,十六进制)和 tag(模块名)。级别从 DEBUG 到 FATAL,越往后越严重。开发期多打 DEBUG 和 INFO,上线前清理掉噪音,只留 WARN 和 ERROR。
import { hilog } from '@kit.PerformanceAnalysisKit'
const DOMAIN = 0x0101
const TAG = 'ShopModule'
hilog.info(DOMAIN, TAG, '商品页加载,商品数=%{public}d', count)
hilog.error(DOMAIN, TAG, '请求失败,code=%{public}d, msg=%{public}s', code, msg)
- DEBUG调试期最细的信息。
- INFO关键流程节点。
- WARN有隐患但不致命。
- ERROR / FATAL出错和崩溃。
domain 用一个应用内统一的编号,tag 用模块名,两者配合就能把日志按模块切开看。别把敏感数据打进去,用户信息要脱敏。
格式化与参数
HiLog 支持带格式的占位符:%{public}s、%{public}d、%{public}f 等。花括号里的 public 表示这条参数可以明文显示,private 则会自动打码,防止隐私泄露。
hilog.info(DOMAIN, TAG, '用户 %{public}s 登录成功,耗时 %{public}d ms',
user.name, costMs)
占位符别和字符串拼接混用:拼接会创建新对象、还要做转义,性能差;占位符是格式化输出,快得多。日志量大时这个差异会被放大。
另外,%{private} 会把参数自动打码为
还有一点容易被忽略:日志的打印本身也有成本,高频打点(例如每次滚动、每帧渲染)会在发布版里拖慢性能。上线前把 DEBUG 和 INFO 的噪音清掉,保留 WARN 以上,再用开关按需打开详细日志,排查线上问题时就能既保性能、又留后路。
过滤器与设备查看
DevEco Studio 的 Log 窗口支持按 level、tag、关键字过滤。命令行也能用 hdc 抓日志,再配合 grep 看关键行。
hdc shell hilog -T ShopModule -e error
hdc shell hilog -t "ShopModule" -D 0x0101
真机上日志默认有缓冲区上限,量大时可能被冲掉。紧要日志记到文件里,或者提高级别过滤,避免日志把性能拖垮。
崩溃日志与调试器
崩溃发生时,HiLog 会打出 FATAL 记录和堆栈。拿到堆栈先看最上面一行,那是崩溃现场。别急着修,先还原调用链:谁调了它、数据是什么。
// 未捕获异常统一兜底,打出现场
import { faultLogger } from '@kit.PerformanceAnalysisKit'
faultLogger.query({ type: faultLogger.FaultType.JS_CRASH })
.then(list => {
for (const item of list) {
console.info('crash info:', JSON.stringify(item))
}
})
断点调试配合日志最稳:断点看变量,日志看时序。异步任务里的错误往往不在断点处出现,用 ERROR 日志把异步回调的状态打出来,比追断点快。
实战:定位卡顿问题
列表滚动掉帧,怎么查?先在关键节点打时间戳,用 INFO 记录每个阶段的耗时,再比对哪一段异常。
const t0 = performance.now()
loadData().then(() => {
const t1 = performance.now()
hilog.info(DOMAIN, TAG, '数据加载耗时 %{public}d ms', t1 - t0)
renderList()
const t2 = performance.now()
hilog.info(DOMAIN, TAG, '渲染耗时 %{public}d ms', t2 - t1)
})
数据加载正常但渲染慢,就去看渲染链路;渲染快但总时长超,再看网络。日志把每一段切开,瓶颈一眼可见。
小结
HiLog 四件事:分级打点(DEBUG 到 FATAL)、domain 分域、占位符格式化、过滤器定位。崩溃看 FATAL 和堆栈,性能用时间戳切段。把日志当成代码的一部分来维护,调试就从"撞运气"变成"看地图"。