4. hilog 命令行工具:命令行过滤与日志导出

聊完了代码里怎么打日志,咱们得说说怎么在命令行里把这些日志捞出来看。说实话,我见过不少开发者,代码里打了一堆日志,结果到了调试阶段,对着终端里刷屏的信息一脸懵——这其实就是没用好 hilog 的过滤功能。

hilog 命令行工具,说白了就是鸿蒙系统给咱们准备的一把「手术刀」。它能帮你精准切出想要的那部分日志,而不是让你在茫茫信息海里捞针。我个人习惯是,只要开始调试,终端里一定开着 hilog,随时准备抓现场。

4.1 基础过滤:-T 标签与 -L 级别

先说说最常用的两个参数:-T-L。这两个组合起来用,基本能覆盖 90% 的日常调试场景。

-T 标签过滤

标签(Tag)是日志的第一道筛子。比如你只关心网络模块的日志,那就指定它的标签:

hilog -T NetManager

这样终端里就只会显示标签为 NetManager 的日志。我在项目里调试蓝牙模块时,经常同时开好几个标签:

hilog -T BtHost -T BtController

嗯,这里要注意:多个 -T 参数是「或」的关系,只要匹配其中一个就会显示。

-L 级别过滤

级别过滤就更直观了。你想想看,线上环境日志量巨大,你不可能把 DEBUG 级别的日志都开着。这时候用 -L 指定最低级别:

hilog -L WARN

这条命令只显示 WARN、ERROR、FATAL 级别的日志。我一般调试阶段用 -L DEBUG,发布后用 -L INFO-L WARN

我的小技巧: 调试某个具体功能时,我会把标签和级别组合起来用。比如只关注网络模块的错误日志:hilog -T NetManager -L ERROR。这样信息量刚刚好,不会漏掉关键错误,也不会被无关信息干扰。

4.2 实时查看:像 tail -f 一样跟踪日志

hilog 默认就是实时输出的,这点和 Linux 的 tail -f 很像。你运行命令后,终端会一直等待新的日志产生并打印出来。

但实时查看有个痛点——日志刷太快,根本来不及看。我遇到过这种情况:某个模块启动时疯狂打日志,一秒几百条,关键信息瞬间就被冲走了。

这时候我一般会配合 grep 做二次过滤:

hilog -T MyModule | grep "关键字段"

或者用 head 限制输出行数:

hilog -T MyModule | head -50

这样只取前 50 条,看完再继续。说白了,实时查看的精髓不在于「看」,而在于「抓」——抓住那一瞬间的关键信息。

注意: 实时模式下,如果日志量特别大(比如每秒上千条),终端可能会卡顿。我曾经在压力测试时遇到过这个问题,后来改用带缓冲的导出方式才解决。后面会讲到。

4.3 日志导出:把现场保存下来

实时查看适合快速定位问题,但有些 bug 需要反复分析,或者需要把日志发给同事看。这时候就需要导出功能了。

导出到文件

最简单的导出方式就是重定向:

hilog -T MyModule -L DEBUG > my_log.txt

这样所有匹配的日志都会写入 my_log.txt 文件。我习惯在文件名里加上时间戳,方便后续查找:

hilog -T MyModule > "log_$(date +%Y%m%d_%H%M%S).txt"

指定输出格式

hilog 支持多种输出格式,我个人比较喜欢用 --format 参数控制:

hilog -T MyModule --format time,level,tag,message

这样输出的日志包含时间、级别、标签和消息内容,信息完整又不冗余。如果你需要解析日志,建议用 CSV 格式:

hilog -T MyModule --format csv > log.csv

这样可以直接用 Excel 或 Python 脚本分析,非常方便。

避坑指南: 我曾经在导出日志时犯过一个低级错误——没有指定缓冲区大小。结果日志量太大,文件写到一半 hilog 进程被 OOM 杀掉了。后来我学乖了,导出大量日志时加上 --buffer-size 参数:hilog -T MyModule --buffer-size 8192 > log.txt。缓冲区设大一点,能有效避免丢日志。

4.4 实用组合拳:几个我常用的场景

光讲参数没意思,我分享几个实际调试中常用的组合命令,你直接拿去用就行。

场景 命令 说明
快速定位崩溃 hilog -L FATAL -T * 只看 FATAL 级别,所有标签
跟踪模块启动 hilog -T MyModule -L DEBUG | head -200 取前 200 条,看启动流程
导出错误日志 hilog -L WARN --format csv > errors.csv 导出 WARN 及以上级别,CSV 格式
实时监控性能 hilog -T Performance -L INFO 只关注性能模块的 INFO 及以上日志
多标签联合过滤 hilog -T BtHost -T BtController -L DEBUG 同时看蓝牙两个模块的调试日志

你看,这些命令都不复杂,但组合起来能解决大部分调试场景。我刚开始用 hilog 时也记不住这么多参数,后来把常用的几条存成了 shell 脚本,用的时候直接执行,省心不少。

4.5 进阶技巧:日志轮转与持久化

最后聊一个进阶话题——日志轮转。如果你的设备需要长时间运行,日志文件会越来越大。我遇到过一台设备跑了三天,日志文件撑到了 2GB,打开都费劲。

hilog 支持日志轮转,通过 --rotate 参数控制:

hilog -T MyModule --rotate --max-size 10M --max-files 5

这条命令的意思是:每个日志文件最大 10MB,最多保留 5 个文件,超过就自动轮转。这样既不会丢日志,也不会撑爆磁盘。

嗯,这里要提醒一下:日志轮转在嵌入式设备上特别重要。那些设备存储空间本来就小,一个不小心日志就把 flash 写满了,系统直接挂掉。我吃过这个亏,所以现在只要做长时间测试,一定会开轮转。

我的习惯: 调试阶段用实时查看 + 手动导出,发布阶段用日志轮转 + 自动清理。这样既保证了调试效率,又避免了线上环境被日志撑爆。

好了,这一章的内容就这些。hilog 命令行工具其实还有很多参数,但上面这些已经能覆盖你 95% 的日常需求了。下一章咱们聊聊更高级的用法——如何用 hilog 做性能分析和问题定位。到时候我会分享一些我在实际项目中遇到的坑,保证让你少走弯路。