Page 483 - 《软件学报》2024年第4期
P. 483
吴圣垚 等: HiLog: OpenHarmony 的高性能日志系统 2061
OpenHarmony 上的系统应用以及第三方应用构成. 针对这种分层架构, 操作系统的开发人员也分为 3 类, 分别为
内核开发者、系统开发者和应用开发者, 不同开发者关心的信息是不同的. 因此为了方便开发者区分不同层级产
生的日志, HiLog 将日志分为内核日志、系统日志和应用日志 3 类, 并实现日志的分类管理.
3.1.2 日志级别
为了方便开发者和运维人员快速分辨系统状态的严重程度, 日志应当基于记录事件的重要程度划分级别. 分
级的标准如下: ① 日志的级别数目不应过多或过少, 防止检索困难或分类标准不明. ② 每个日志级别应当有清晰
的使用标准, 开发者在开发时不可混用. ③ 在写入时, 每条日志都应当分配到一个日志级别. ④ 在输出时, 每个级
别的日志都需要采用不同的字体或者颜色来区分. 基于上述标准, HiLog 将日志分为调试 (Debug)、通知 (Info)、
告警 (Warn)、错误 (Error) 和致命错误 (Fatal) 这 5 个等级, 相应的使用标准和输出特征如后文表 2 所示.
3.1.3 日志数据结构
HiLog 日志除了提供日志类型 (Type)、级别 (Level) 以外, 还需要提供版本 (Version)、时间 (Time)、进程 ID
(PID)、线程 ID (TID)、业务 (Domain) 共计 5 项辅助信息. 为了减少 IPC 开销和存储开销, 提高日志系统的日志吞
吐量, HiLog 日志在传输和存储时采用位域定义结构体, 减少信息所占用的空间. 相较于全部使用 C 语言基本数据
类型定义的结构体, 每条日志体积减小 134 bits, 体积最高缩小 59.8 % (Tag 和 Content 为空时), HiLog 日志数据结
构如表 3 所示.
表 2 HiLog 日志级别定义 表 3 HiLog 日志数据结构
HiLog日志级别 使用标准 输出特征 序号 信息 位域类型 位域宽度 (bits)
展示调试时用于详细了解系统 1 Version unsigned int 8
Debug 紫色字体
运行状态的信息 2 Time unsigned int 40
Info 告知操作执行或状态变化 白色字体 3 PID unsigned int 5
警示不正确的状态, 但是系统可 4 Level unsigned int 3
Warn 黄色字体
以继续运行 5 TID unsigned int 8
报告错误已经发生, 不确定系统 6 Domain unsigned int 8
Error 红色字体
是否可以继续运行 7 Type unsigned int 2
报告严重错误发生, 系统继续运 8 Tag char[] 8–256
Fatal 红棕色字体
行会存在极高风险 9 Content char[] 8–8192
3.2 日志系统功能定义
基于日志系统的使用需求, HiLog 需要提供日志写入、日志读取、日志控制 3 类能力. 下面将分别对 3 类能
力做出说明.
(1) HiLog 提供日志写入能力, 包括日志生成、日志排序、日志暂存. 日志生成的作用是在系统运行时产生日
志信息; 日志排序功能按照时间戳对写入的日志内容进行排序; 日志暂存就是维护一个内存缓冲区, 用于将完成排
序的日志存储在其中. 在开发时 HiLog 的使用者通过引入 libhilog 的头文件, 使用 libhilog 提供的写日志接口编写
程序, 在程序运行时 libhilog 即可生成日志. libhilog 在生成日志过程中还提供数据保护、进程流控等辅助能力. 接
下来, 在标准 HiLog 中, hilogd 收集来自各个 libhilog 的日志信息, 按时间进行排序, 并进入缓冲区暂存. 在轻量
HiLog 中, 日志缓冲区是 LiteOS 的 kernel_log_buffer, 相应的日志排序和暂存能力由 kernel_log_buffer 实现.
(2) HiLog 提供日志输出能力, 包括日志打印、日志持久化的能力. 日志打印功能可以读取暂存的日志写入到
标准输出 (std_out), 并且支持通过辅助信息等特征进行筛选; 日志持久化功能可以将暂存的日志写入文件, 并进一
步地提供压缩功能. 在运行时 HiLog 使用者可以通过 hilogtool 命令行工具执行日志打印、持久化等输出工作.
(3) HiLog 提供日志系统控制能力, 其中包括提供数据安全、进程流控、业务流控、缓冲区以及持久化的配
置能力. 通过对 hilogtool 输入相应指令, 系统开发者即可在 HiLog 运行时实现上述能力的自定义, 以满足在不同
的硬件平台和业务场景的适配需求. 例如, 当操作系统内存空间紧张, 可以缩小日志缓冲区空间, 为其他程序让出
更多内存. 又例如, 当操作系统 CPU 负载较高, 可以降低流量控制阈值, 减少 HiLog 日志处理消耗的 CPU 资源.