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  资源.
   478   479   480   481   482   483   484   485   486   487   488