编辑
2025-01-22
工作知识
0
请注意,本文编写于 135 天前,最后修改于 135 天前,其中某些信息可能已经过时。

目录

一、hilog概述
二、hilog使用说明
2.1、 hilog实时抓取日志
2.2、hilog记录和保存日志
三、hilog的代码填写示例

开发Openharmony的时候,经常需要调试Openharmony的hdi层,这层对上是对接UI,对下对接内核hdf,所以经常需要通过hilog命令来进行开发调试,本文根据display框架来讲解hilog的使用技巧

一、hilog概述

hilog是openharmony的日志系统,我们可以等价的理解为android的logcat,对于hilog而言,只要系统启动了hilogd,则hilog可以正常工作,如下

# ps -A | grep hilogd 281 ? 00:01:03 hilogd

hilog的架构图如下

image.png

二、hilog使用说明

对于hilog使用,这里总结有两种方式

  1. hilog实时抓取日志
  2. hilog记录和保存日志

2.1、 hilog实时抓取日志

直接运行hilog即可抓取当前系统的hilog日志,如下

# hilog 04-18 08:52:57.711 0 0 I I00000/HiLog: ========Zeroth log of type: init

可以留意的是,hilog是将缓存的日志打印出来并阻塞等待新的日志信息

如果相对hilog日志做区分,可以将hilog日志分为init,app,core。分别对应启动日志,应用日志,核心(HDI)日志,如下:

# hilog -t init 04-18 08:52:57.711 0 0 I I00000/HiLog: ========Zeroth log of type: init

hilog日志存在日志等级,info,debug,error, fault。如果我们需要查看指定等级的日志可以如下:

hilog -L E 04-18 10:57:23.289 776 776 E C02f01/AccessTokenInfoManager: [GetNativeTokenInfo]:token 537715846 is invalid.

hilog默认关闭了debug等级的日志, 所以如果需要打开debug级别的日志,则需要单独设置hilog的输出日志等级,如下

# hilog -b D Set global log level to D successfully # hilog -L D 04-18 10:59:00.008 1285 1285 D A0001a/SystemUI_Default: CommonEvent_TimeManager --> handle common event: usual.event.TIME_TICK

hilog可以指定模块tag的日志进行显示,从而达到过滤的作用,可以通过如下指定只查看DISP显示模块的日志

# hilog -T DISP 04-18 11:00:00.063 746 752 D C02500/DISP: [CallLayerFunction:51] device Id : 1

hilog可以给日志带上颜色,这样我们可以很方便的通过颜色来判断什么日志是我们需要关心的,如下

hilog -T DISP -v color 04-18 11:02:00.051 746 752 D C02500/DISP: [CallLayerFunction:51] device Id : 1 04-18 11:02:00.051 746 752 D C02500/DISP: [GetHdiLayer:214] id : 78

hilog可以指定pid来查看日志,如果我们知道服务是哪个进程启动的,则可以如下

# hilog -P `pidof composer_host` 04-18 11:04:08.816 746 752 D C02500/DISP: [CallDisplayFunction:39] device Id : 1

hilog可以过来日志信息中的关键字,如果我们对日志内部有关键字标识,可以如下

hilog -e failed 04-18 11:07:30.432 1328 1343 E C03900/Ace: [<private>(<private>)] connect failed errno:111

2.2、hilog记录和保存日志

通常情况下,hilog可以抓取大部分的日志,但是对于开机日志,我们只能通过hilog日志保存到文件上,重新开机来抓取这次开机的错误日志信息来判断问题,所以需要如下设置

hilog -w stop hilog -w start -m none -f display -l 20M hilog -b D rm /data/log/hilog/* reboot

此时hilog打开了日志保存文件的功能,文件默认保存在/data/log/hilog/display.*下,此时我们重启,则可以将重启的hilog日志进行导出,此时导出日志需要利用hdc命令,hdc命令是类似于android的adb命令。故如下

hdc file recv /data/log/hilog/ .

这样我们可以将机器的hilog日志正常导出出来

三、hilog的代码填写示例

对于hilog日志,不同的模块通过不同的封装来实现,我以display模块为例。对于打印display模块的hilog日志,可以如下

DISPLAY_LOGD("kylin: set crtc to active");

可以发现DISPLAY_LOGD是一个宏定义,如下

#ifndef DISPLAY_LOGI #define DISPLAY_LOGI(format, ...) \ do { \ HILOG_INFO(LOG_CORE, "[%{public}s@%{public}s:%{public}d] " format "\n", __FUNCTION__, FILENAME, __LINE__, \ ##__VA_ARGS__); \ } while (0) #endif

可以知道其定义是HILOG_INFO,在base/hiviewdfx/hilog/interfaces/native/innerkits/include/hilog/log_c.h定义如下

#define HILOG_INFO(type, ...) ((void)HILOG_IMPL((type), LOG_INFO, LOG_DOMAIN, LOG_TAG, __VA_ARGS__)) 对于HILOG_IMPL定义如下 #define HILOG_IMPL(type, level, domain, tag, ...) HiLogPrint(type, level, domain, tag, ##__VA_ARGS__)

对于HiLogPrint定义如下

int HiLogPrint(LogType type, LogLevel level, unsigned int domain, const char *tag, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = HiLogPrintArgs(type, level, domain, tag, fmt, ap); va_end(ap); return ret; }

故,大家在开发openharmony时,注意好日志的宏设计即可