往期鸿蒙5.0全套实战文章必看:(文中附带全栈鸿蒙5.0学习资料)
基于hilog日志使用相关问题指南
背景
在应用开发过程中,可在关键代码处输出日志信息。在运行应用后,通过查看日志信息来分析应用执行情况(如应用是否正常运行、代码运行时序、运行逻辑分支是否正常等),特别是出现故障时需要使用落盘hilog日志来进行问题分析。
一、Hilog落盘日志获取
1、日志落盘介绍:
(1)规格介绍:
默认hilog落落盘数量是1000个,kmsg是100个,大小都是4M一个。
日志落盘时,日志ID从0开始,日志数量超过1000个时,ID回绕到0继续记录。
(2)查询当前落盘任务:hilog -w query
- 无落盘任务:
- 存在hilog日志落盘任务,路径是/data/log/hilog 文件名是hilog,单个文件大小是4M,文件数量最多保存10个:
(3)关闭日志落盘任务:hilog -w stop
(4)开启日志落盘任务:hilog -w start -n 1000
开启hilog落盘服务,并且设置落盘文件为1000个,kmsg落盘文件为100个:
(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.开头的是底软日志。
- 使用命令获取全量日志:
使用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
结果:
- 复现问题前执行命令获取实时的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平台为例:
b. 环境配置
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,即可进行解析操作,如下图:
备注:记得带上hilog_dict开头字典文件
,由于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环境查看日志。