【入门到精通】鸿蒙next开发:基于hilog日志使用相关问题指南

往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)


基于hilog日志使用相关问题指南

背景

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

一、Hilog落盘日志获取

      1、日志落盘介绍:

     (1)规格介绍:

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

1.png

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

     (2)查询当前落盘任务:hilog -w query

  • 无落盘任务:

    2.png

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

    3.png

     (3)关闭日志落盘任务:hilog -w stop

4.png

     (4)开启日志落盘任务:hilog -w start -n 1000

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

5.png

     (5)增加落盘数量

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

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 后面的参数为日志文件数量

      2、日志获取方式

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

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

6.png

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

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

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

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

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

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

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

a. 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

b. 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

结果:

7.png

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

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

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

3、加密日志的解析

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

a. 工具获取

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

8.png

b. 环境配置

9.png

      c. 命令解析

命令: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,即可进行解析操作,如下图:

10.png

备注:记得带上hilog_dict开头字典文件

11.png

,由于hilog会加密每个设备,生成的字典不一样,解码hilog需要字典。

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

        d. 落盘日志的清除命令解析

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

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

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

Hilog日志查看问题FAQ

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

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

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

      排查方案:

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

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

LOGLIMIT是domainID 对应的log,slowreader是全局的日志丢失,write socket failed是进程对应的日志丢失。

  • 领域日志丢失:"LOGLIMIT"

    a. 含义:表示日志打印超限被流控了,属于领域日志量超出hilog规格后的主动管控,需要领域对日志进行精简和整改。

    b. 规避方法:

    临时修改(重启失效):

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

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

  • 全局日志丢失:Slow reader missed"

    a. 含义:表示打印时间点前后日志量太大,hilog buffer中的日志还未落盘已经被循环覆盖了。

    b. 原因:排查是否打开了D级别或者关闭了流控、或者有模块在循环打印日志等。

    c. 规避方法:

    修改:

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

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

  • 进程日志丢失:"write socket failed"

    a. 含义:日志写入socket失败,出现丢包问题。

    b. 原因:

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

    c. 规避方法:

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

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

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

         3、命令行输出中文日志乱码

  • 临时解决(单次生效):

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

  • 永久解决:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值