背景:

在应用开发过程中,可在关键代码处输出日志信息。在运行应用后,通过查看日志信息来分析应用执行情况(如应用是否正常运行、代码运行时序、运行逻辑分支是否正常等),特别是出现故障时需要使用落盘hilog日志来进行问题分析。

Hilog落盘日志获取

  1. 日志落盘介绍:
    1. 规格介绍

默认hilog落落盘数量是1000个,kmsg100个,大小都是4M一个。

日志落盘时,日志ID0开始,日志数量超过1000个时,ID回绕到0继续记录。

    1. 查询当前落盘任务:hilog -w query
      1. 无落盘任务:

      1. 存在hilog日志落盘任务,路径是/data/log/hilog 文件名是hilog,单个文件大小是4M,文件数量最多保存10个:

    1. 关闭日志落盘任务:hilog -w stop

    1. 开启日志落盘任务:hilog -w start -n 1000

开启hilog落盘服务,并且设置落盘文件为1000个,kmsg落盘文件为100个:

    1. 增加落盘数量

临时调试可以用命令修改(重启后失效):

hdc shell hilog -w stop                            // 停止当前日志落盘任务

hdc shell hilog -w start -t kmsg -n 1000   // 重启kmsg log落盘任务, - n 后面的参数为日志文件数量

hdc shell hilog -w start -n 1000              // 重启hilog 落盘任务, - n 后面的参数为日志文件数量

  1. 日志获取方式
  • 使用IDE自带Device File Browser工具获取hilog日志:

连接设备,打开工具,打开/data/log/hilog目录就可以看到hilog日志,可以根据日志文件名查找相应时间的日志,hilog.开头的是hilog日志,hilog_kmsg.开头的是底软日志。

  • 使用命令获取全量日志:

使用hdc file recv命令获取hilog日志文件到本地目录。

命令:hdc file recv /data/log/hilog/  localDir

备注:不使用localDir指定导出目录时,默认导出到当前目录。

  • 使用脚本按匹配事件获取日志:

使用上述命令会将设备端hilog目录所有文件都拉到本地,如果日志多这里获取的日志就会比较大。因此可以通过编写脚本获取自己匹配需要时间段内的日志,根据系统可以将下面bat/shell 源码保存为脚本执行:(注意系统需要配置hdc到环境变量)

    1. windows系统 bat脚本参考如下:

@rem 获取相应时间hilog日志,hilog日志文件名格式:hilog.034.20240520-160605.gz
@rem 输入 targetDate 可以根据要获取的时间自己修改,匹配是根据文件名字符串匹配
@echo off
@set targetDate=20240520-16
@echo start get hilog, time matching: %targetDate%
@set Dir=HILOG_%targetDate%
md %Dir%
@echo hilog downloading...
@for /f "tokens=*" %%i in ('hdc shell ls /data/log/hilog') do (
    echo %%i | findstr %targetDate% >nul && (
        echo download %%i
        hdc file recv /data/log/hilog/%%i .\%Dir%\
    )
     
    echo %%i | findstr hilog_dict >nul && (
        echo download %%i
        hdc file recv /data/log/hilog/%%i .\%Dir%\
    )
)
echo download hilog Done!
@pause

    1. Mac系统shell脚本参考如下:

# 获取相应时间hilog日志,hilog日志文件名格式:hilog.034.20240520-160605.gz
# 输入 targetDate 可以根据要获取的时间自己修改,匹配是根据文件名字符串匹配
targetDate=20240520-16
echo start get hilog, time matching: $targetDate
Dir=HILOG_$targetDate
mkdir $Dir
for var in $(hdc shell 'ls /data/log/hilog/')
do
    if [[ $var =~ $targetDate ]]
    then
        echo download $var
        echo $(hdc file recv //data//log//hilog//$var ./$Dir)
    fi
     
    if [[ $var =~ 'hilog_dict' ]]
    then
        echo download $var
        echo $(hdc file recv //data//log//hilog//$var ./$Dir)
    fi
done
echo "download hilog Done!"
echo "Press Enter to continue..."
read -n  1

结果:

  • 复现问题前执行命令获取实时的hilog日志:

获取hilog实时日志命令:hdc hilog > log.txtlog.txt会保存到当前目录下。

在复现问题前执行该命令就能获取相应问题时候的hilog日志。

  1. 加密日志的解析

为了著降低端测维测资源开销,提升研发和商用版本问题解决率,当前落盘的hilog日志为编码后二进制形式保存的gz格式文件,开发者从设备/data/log/hilog路径下导出后无法直接解压查看,需要使用hilogtool工具进行解析,将转换为明文hilog日志。

    1. 工具获取

下载HarmonyOS SDK(开源、闭源合一包),取对应平台 /sdk/hms/toolchains目录下的hilogtool.exe,下面以windows平台为例:

    1. 环境配置

    1. 命令解析

命令:hilogtool parse -i xxx -o xxx -d xxx

解析命令参数列表:

选项

描述

举例

-i/-input inputDir

用于指定输入路径,会扫描该目录下所有的hilog流水日志文件并进行解析;

缺省时,为命令行当前所在路径;

解析指定目录(D:\temp\hilog)下的所有hilog文件:

hilogtool parse -i D:\temp\hilog

解析当前目录下的所有hilog文件:

hilogtool parse -i .\

-o/-output outputDir

用于指定输出路径,即解析后的日志文件保存路径;

缺省时,为解析的hilog原日志文件所在路径;

解析当前目录下的日志文件到D:\temp目录:

hilogtool parse -i .\ -o D:\temp

-d/--dict dictFile

用于指定数据字典的路径;

缺省时,会在命令行当前所在路径下匹配最新的数据字典文件(格式:hilog_dict.20230908-142200.zip

解析指定目录(D:\temp\hilog)下的所有hilog文件,并且指定使用该目录下的数据字典:

hilogtool parse -i D:\temp\hilog -d D:\temp\hilog\hilog_dict.20230908-142200.zip

 

解析当前目录下所有的hilog文件

在当前日志所在目录,通过cmd进入shell窗口,在shell窗口直接执行hilogtool parse,即可进行解析操作,如下图:

备注:记得带上hilog_dict开头字典文件,由于hilog会加密每个设备,生成的字典不一样,解码hilog需要字典。

如果使用删除命令导致删除了字典日志后,可以重启设备重新生成一下字典文件。

    1. 落盘日志的清除

删除缓存区的日志:hilog -r

删除已经落盘的data/log/hilog文件: hilog -w clear

不要用rm rf /data/log/hilog/删除整个hilog文件,这会使数据字典文件也同时被删除。可以用rm /data/log/hilog/*.gz命令删除。

Hilog日志查看问题FAQ

  1. 部分日志必定不打印:

大概率是因为打印参数传入错误,代码分支没有走到,请先盘查代码原因。

  1. 打印过程中代码概率性丢失(打印时有时无,无规律丢失)

排查方案:

目前日志丢失的情况分为三种,领域日志丢失、全局日志丢失、进程日志丢失。

可以在hilog日志里面搜索对应关键字:LOGLIMIT|Slow reader missed|write socket failed

LOGLIMITdomainID 对应的logslowreader是全局的日志丢失,write socket failed是进程对应的日志丢失。

  • 领域日志丢失"LOGLIMIT"
      1. 含义:表示日志打印超限被流控了,属于领域日志量超出hilog规格后的主动管控,需要领域对日志进行精简和整改。
      2. 规避方法:

临时修改(重启失效):

关闭pid流控机制(针对LOG_APP类型日志):hilog -Q pidoff

关闭domain流控机制(针对LOG_CORE类型日志):hilog -Q domainoff

  • 全局日志丢失:Slow reader missed"
      1. 含义:表示打印时间点前后日志量太大,hilog buffer中的日志还未落盘已经被循环覆盖了。
      2. 原因:排查是否打开了D级别或者关闭了流控、或者有模块在循环打印日志等。
      3. 规避方法:

修改:

hilog buffer大小默认是256K,可以通过修改hilog buffer大小命令,hilog -G 16M,表示将buffer大小修改为16M(当前允许的最大规格为16M)。

同时查看是否后台有领域频繁打印日志导致,若发现某个领域日志频繁打印,影响正常日志读取,可以通过命令关闭其领域的日志打印

  • 进程日志丢失:"write socket failed"
      1. 含义:日志写入socket失败,出现丢包问题。
      2. 原因:
      • 日志量过大,排查是否打开了D级别或者关闭了流控、或者问题时间点前后日志量是否过大(每秒超过3K行),有模块在循环打印日志等。
      • 排查当时的运行环境是否存在高负载问题,如果出现高负载或者低内存问题,会导致socket服务端处理日志过慢,socket通道中日志堆积严重,也会导致客户端写入socket数据失败。
      1. 规避方法:

例如,只想系统打印 A03200 C03201的日志,可以执行下面的命令,重启失效:

hilog -b I -D d003200 (将03200 domain能够打印出来的日志级别设为INFO

hilog -b I -D d003201(将03201 domain能够打印出来的日志级别设为INFO

  1. 命令行输出中文日志乱码
  • 临时解决(单次生效):

在当前cmd窗口(非hdc shell环境中)中输入chcp 65001 , 随后进入hdc shell查看乱码问题是否解决,此方式只在当前cmd窗口生效。

  • 永久解决

cmd本身未提供直接的配置文件修改项来设置编码格式,可以通过自定义一个批处理脚本解决,新建一个txt文件,输入以下内容,将文件另存为bat文件,如cmd_utf8.bat,保存即可,每次直接双击 cmd_utf8.bat 执行即可打开命令窗口,在该窗口中进入hdc shell环境查看日志。

@echo off
cmd /k chcp 65001

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐