开发Openharmony的时候,经常需要调试Openharmony的hdi层,这层对上是对接UI,对下对接内核hdf,所以经常需要通过hilog命令来进行开发调试,本文根据display框架来讲解hilog的使用技巧
hilog是openharmony的日志系统,我们可以等价的理解为android的logcat,对于hilog而言,只要系统启动了hilogd,则hilog可以正常工作,如下
# ps -A | grep hilogd 281 ? 00:01:03 hilogd
hilog的架构图如下
对于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
通常情况下,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日志,不同的模块通过不同的封装来实现,我以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时,注意好日志的宏设计即可