【OpenHarmony】日志服务hilog_lite

HiLog_Lite 模块

目录

  1. 模块概述
  2. 模块结构
  3. 模块间交互
  4. 状态机转换图
  5. 接口设计

1. 模块概述

源码:https://gitee.com/openharmony/hiviewdfx_hilog_lite

1.1 功能与目标

HiLog_Lite 是 OpenHarmony 操作系统 DFX(Design For X)子系统中的轻量级流水日志组件,主要功能包括:

核心功能

  • 提供轻量系统(LiteOS-M)和小型系统(LiteOS-A)的流水日志功能
  • 支持多级别日志输出:DEBUG、INFO、WARN、ERROR、FATAL
  • 支持模块化日志管理,最多支持64个模块
  • 支持日志隐私保护({public}/{private}标识符)
  • 支持日志流量控制和限流机制
  • 支持多种输出方式:UART实时输出、文件存储(文本/二进制)

设计目标

  • 低资源占用:ROM约500KB,RAM约500KB
  • 高性能:支持异步日志处理,减少对主业务的影响
  • 可配置性:支持编译时和运行时配置日志级别、输出模块等
  • 隐私保护:支持日志参数隐私标记,商业版本自动脱敏

1.2 系统位置

复制代码
┌─────────────────────────────────────────────────────────────────┐
│                     OpenHarmony 系统                             │
├─────────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐              │
│  │   应用层    │  │   框架层    │  │   服务层    │              │
│  │  (APP)      │  │  (ACE)      │  │  (SAMGR)    │              │
│  └──────┬──────┘  └──────┬──────┘  └──────┬──────┘              │
│         │                │                │                      │
│         └────────────────┼────────────────┘                      │
│                          ▼                                       │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │                  DFX 子系统 (hiviewdfx)                    │  │
│  │  ┌─────────────────────────────────────────────────────┐  │  │
│  │  │              hilog_lite (本模块)                     │  │  │
│  │  │  ┌───────────┐ ┌───────────┐ ┌───────────────────┐  │  │  │
│  │  │  │frameworks │ │ services  │ │    command        │  │  │  │
│  │  │  │ mini/     │ │hilogcat   │ │                   │  │  │  │
│  │  │  │ featured  │ │apphilogcat│ │                   │  │  │  │
│  │  │  └───────────┘ └───────────┘ └───────────────────┘  │  │  │
│  │  └─────────────────────────────────────────────────────┘  │  │
│  │                          │                                 │  │
│  │  ┌───────────────────────┼───────────────────────────┐    │  │
│  │  │     hiview_lite       │      hievent_lite         │    │  │
│  │  └───────────────────────┴───────────────────────────┘    │  │
│  └───────────────────────────────────────────────────────────┘  │
│                          │                                       │
│                          ▼                                       │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │                    内核层 (Kernel)                         │  │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────────┐    │  │
│  │  │ hilogtask   │  │ /dev/hilog  │  │  Ring Buffer    │    │  │
│  │  │ (内核任务)  │  │ (驱动节点)  │  │  (环形缓冲区)   │    │  │
│  │  └─────────────┘  └─────────────┘  └─────────────────┘    │  │
│  └───────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘

模块定位

  • 核心模块:作为DFX子系统的核心组件,为整个系统提供日志服务
  • 基础服务:被系统中几乎所有模块依赖,是系统调试和问题定位的基础设施

与其他模块的关系

依赖模块 关系说明
hiview_lite 提供基础配置和缓存管理
samgr_lite 服务管理和消息通信
utils_lite 基础工具函数
bounds_checking_function 安全函数库

1.3 设计思路与模式

设计思路
  1. 分层架构

    • 接口层:提供统一的日志API(C/C++/JS)
    • 框架层:实现日志格式化、缓存、输出逻辑
    • 服务层:提供日志查看和落盘服务
    • 驱动层:内核态日志处理
  2. 双系统支持

    • mini系统:针对资源受限的LiteOS-M,使用纯C实现
    • featured系统:针对LiteOS-A,支持C++接口和更多特性
  3. 异步处理

    • 日志先写入缓存,异步刷新到文件/UART
    • 减少日志操作对主业务的阻塞
设计模式
  1. 单例模式(Singleton)

    • 全局配置对象 g_hiviewConfig
    • 日志缓存对象 g_logCache
  2. 观察者模式(Observer)

    • 日志文件监控:HiLogFileAddWatcher/HiLogFileRemoveWatcher
    • 支持注册回调函数处理日志事件
  3. 策略模式(Strategy)

    • 多种输出策略:DEBUG输出、FLOW输出、TEXT_FILE、BIN_FILE
    • 通过配置选择不同的输出策略
  4. 生产者-消费者模式

    • 日志产生方(各模块)作为生产者
    • hilogcat/apphilogcat作为消费者
    • 通过Ring Buffer解耦

1.4 系统框图

复制代码
┌─────────────────────────────────────────────────────────────────────────┐
│                          应用/服务层                                     │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐      │
│  │  SAMGR   │ │   ACE    │ │  AAFWK   │ │  MEDIA   │ │   APP    │ ...  │
│  └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘      │
│       │            │            │            │            │             │
│       └────────────┴────────────┼────────────┴────────────┘             │
│                                 ▼                                       │
├─────────────────────────────────────────────────────────────────────────┤
│                          HiLog_Lite 接口层                               │
│  ┌────────────────────────────────────────────────────────────────┐    │
│  │  HILOG_DEBUG/INFO/WARN/ERROR/FATAL (C Macro)                   │    │
│  │  HiLog::Debug/Info/Warn/Error/Fatal (C++ Class)                │    │
│  │  console.debug/info/warn/error (JS API)                        │    │
│  └────────────────────────────────────────────────────────────────┘    │
│                                 │                                       │
│                                 ▼                                       │
├─────────────────────────────────────────────────────────────────────────┤
│                          HiLog_Lite 框架层                               │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────────┐     │
│  │  hiview_log.c   │  │ hiview_output   │  │  hiview_log_limit   │     │
│  │  (日志核心)     │  │  _log.c         │  │  .c (限流控制)      │     │
│  │  - 模块注册     │  │  - 格式化输出   │  │  - 频率限制         │     │
│  │  - 参数解析     │  │  - 缓存管理     │  │  - 阈值配置         │     │
│  │  - 日志打印     │  │  - 文件写入     │  │                     │     │
│  └────────┬────────┘  └────────┬────────┘  └──────────┬──────────┘     │
│           │                    │                      │                 │
│           └────────────────────┼──────────────────────┘                 │
│                                ▼                                        │
│  ┌────────────────────────────────────────────────────────────────┐    │
│  │                      HiviewCache (环形缓冲区)                   │    │
│  └────────────────────────────────────────────────────────────────┘    │
│                                │                                        │
├────────────────────────────────┼────────────────────────────────────────┤
│                          服务层│                                        │
│           ┌────────────────────┼────────────────────┐                   │
│           ▼                    ▼                    ▼                   │
│  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐         │
│  │   hilogcat      │  │  apphilogcat    │  │   hilog_command │         │
│  │  (日志查看)     │  │  (日志落盘)     │  │   (命令行工具)  │         │
│  └────────┬────────┘  └────────┬────────┘  └─────────────────┘         │
│           │                    │                                        │
│           └────────────────────┼────────────────────────────────────────┤
│                                ▼                                        │
│  ┌────────────────────────────────────────────────────────────────┐    │
│  │                    /dev/hilog (设备驱动)                        │    │
│  └────────────────────────────────────────────────────────────────┘    │
│                                │                                        │
├────────────────────────────────┼────────────────────────────────────────┤
│                          内核层│                                        │
│                                ▼                                        │
│  ┌────────────────────────────────────────────────────────────────┐    │
│  │                    hilogtask (内核日志任务)                     │    │
│  │                    Ring Buffer (内核环形缓冲区)                 │    │
│  └────────────────────────────────────────────────────────────────┘    │
│                                │                                        │
│                                ▼                                        │
│  ┌─────────────────┐  ┌─────────────────┐                              │
│  │      UART       │  │   Log Files     │                              │
│  │   (串口输出)    │  │   (日志文件)    │                              │
│  └─────────────────┘  └─────────────────┘                              │
└─────────────────────────────────────────────────────────────────────────┘

2. 模块结构

2.1 源文件与头文件

2.1.1 目录结构
复制代码
hiviewdfx_hilog_lite/
├── interfaces/                    # 接口定义
│   └── native/
│       ├── innerkits/hilog/       # 内部接口(小型系统)
│       │   ├── log.h              # 日志API入口
│       │   ├── hilog_cp.h         # C++接口定义
│       │   ├── hiview_log.h       # 核心日志接口
│       │   └── hilog_trace.h      # 追踪接口
│       └── kits/
│           ├── hilog/log.h        # 小型系统外部接口
│           └── hilog_lite/        # 轻量系统外部接口
│               ├── log.h
│               └── hiview_log.h
├── frameworks/                    # 框架实现
│   ├── mini/                      # 轻量系统实现
│   │   ├── hiview_log.c           # 日志核心实现
│   │   ├── hiview_output_log.c    # 日志输出实现
│   │   ├── hiview_output_log.h
│   │   ├── hiview_log_limit.c     # 日志限流实现
│   │   └── hiview_log_limit.h
│   ├── featured/                  # 小型系统实现
│   │   ├── hilog.cpp              # C++接口实现
│   │   └── hiview_log.c           # 日志核心实现
│   └── js/                        # JS接口实现
│       └── builtin/
│           ├── include/
│           │   ├── hilog_module.h
│           │   ├── hilog_string.h
│           │   ├── hilog_vector.h
│           │   └── hilog_wrapper.h
│           └── src/
│               ├── hilog_module.cpp
│               ├── hilog_string.cpp
│               └── hilog_vector.cpp
├── services/                      # 服务实现
│   ├── hilogcat/                  # 日志查看服务
│   │   └── hiview_logcat.c
│   └── apphilogcat/               # 日志落盘服务
│       └── hiview_applogcat.c
├── command/                       # 命令行工具
│   ├── hilog_command.c
│   └── hilog_command.h
└── test/                          # 测试代码
    └── unittest/
        ├── hilog_lite_test.cpp
        └── hilog_lite_test.h
2.1.2 文件功能说明
文件路径 功能描述
interfaces/native/innerkits/hilog/hiview_log.h 定义日志级别、类型、核心API宏
interfaces/native/innerkits/hilog/hilog_cp.h C++类接口定义(HiLog类)
interfaces/native/kits/hilog_lite/hiview_log.h 轻量系统日志接口,模块类型定义
frameworks/mini/hiview_log.c 轻量系统日志核心实现
frameworks/mini/hiview_output_log.c 日志格式化和输出实现
frameworks/mini/hiview_log_limit.c 日志限流控制实现
frameworks/featured/hilog.cpp 小型系统C++接口实现
frameworks/featured/hiview_log.c 小型系统日志核心实现
services/hilogcat/hiview_logcat.c 实时日志查看工具
services/apphilogcat/hiview_applogcat.c 日志落盘服务
command/hilog_command.c 命令行参数解析

2.2 类、结构体、函数与方法

2.2.1 核心枚举类型
c 复制代码
// 日志模块类型(轻量系统)
typedef enum {
    HILOG_MODULE_HIVIEW = 0,    // DFX模块
    HILOG_MODULE_SAMGR,         // 系统服务管理
    HILOG_MODULE_UPDATE,        // 升级模块
    HILOG_MODULE_ACE,           // 应用框架
    HILOG_MODULE_APP,           // 第三方应用
    HILOG_MODULE_AAFWK,         // 原子化服务框架
    HILOG_MODULE_GRAPHIC,       // 图形模块
    HILOG_MODULE_MEDIA,         // 多媒体模块
    HILOG_MODULE_DMS,           // 分布式调度
    HILOG_MODULE_SEN,           // 传感器
    HILOG_MODULE_SCY,           // 安全模块
    HILOG_MODULE_SOFTBUS,       // 软总线
    HILOG_MODULE_POWERMGR,      // 电源管理
    HILOG_MODULE_UIKIT,         // UI框架
    HILOG_MODULE_GLOBAL,        // 全局子系统
    HILOG_MODULE_DATAMGR,       // 数据管理
    HILOG_MODULE_INIT,          // 初始化
    HILOG_MODULE_MAX = 64       // 最大模块数
} HiLogModuleType;

// 日志级别(小型系统)
typedef enum {
    LOG_DEBUG = 3,              // 调试级别
    LOG_INFO = 4,               // 信息级别
    LOG_WARN = 5,               // 警告级别
    LOG_ERROR = 6,              // 错误级别
    LOG_FATAL = 7,              // 致命级别
} LogLevel;

// 日志类型
typedef enum {
    LOG_TYPE_MIN = 0,
    LOG_INIT = 1,               // 初始化阶段日志
    LOG_CORE = 3,               // 核心服务日志
    LOG_TYPE_MAX
} LogType;
2.2.2 核心结构体
c 复制代码
// 日志通用头信息(轻量系统)
#pragma pack(1)
typedef struct {
    uint8 head;                 // 日志头标识
    uint8 module;               // 模块ID
    uint8 level : 4;            // 日志级别
    uint8 valueNumber : 4;      // 参数个数
    uint8 task;                 // 任务ID
    uint32 time;                // 时间戳(秒)
    uint16 milli;               // 毫秒
    const char *fmt;            // 格式化字符串
} HiLogCommon;

// 日志内容
typedef struct {
    HiLogCommon commonContent;
    uint32 values[LOG_MULTI_PARA_MAX]; // 参数值(最多6个)
} HiLogContent;
#pragma pack()

// 日志条目(小型系统)
struct HiLogEntry {
    unsigned int len;           // 日志长度
    unsigned int hdrSize;       // 头部大小
    unsigned int pid : 16;      // 进程ID
    unsigned int taskId : 16;   // 任务ID
    unsigned int sec;           // 时间戳(秒)
    unsigned int nsec;          // 纳秒
    unsigned int reserved;      // 保留字段
    char msg[0];                // 日志消息(柔性数组)
};

// 日志限流规则
typedef struct {
    uint8  maxNum;              // 最大日志行数限制
    uint8  logNum;              // 当前日志计数
    uint16 baseTime;            // 基准时间
    uint32 totalLogNum;         // 总日志数
    uint32 totalDropLogNum;     // 丢弃日志数
} HiLogLimitRule;

// 配置结构体
typedef struct {
    const unsigned char outputOption : 4;  // 输出选项
    unsigned char hiviewInited : 1;        // 初始化标志
    unsigned char level : 3;               // 日志级别
    unsigned char logSwitch : 1;           // 日志开关
    unsigned char eventSwitch : 1;         // 事件开关
    unsigned char dumpSwitch : 1;          // dump开关
    unsigned char silenceMod : 1;          // 静默模式
    char logOutputModule[6];               // 输出模块过滤
    unsigned short writeFailureCount;      // 写入失败计数
} HiviewConfig;
2.2.3 C++ 类定义
cpp 复制代码
namespace OHOS {
namespace HiviewDFX {

// 日志标签结构
struct HiLogLabel {
    LogType type;               // 日志类型
    unsigned int domain;        // 领域ID
    const char *tag;            // 日志标签
};

// HiLog 类(静态方法类)
class HiLog final {
public:
    // 输出调试日志
    static int Debug(const HiLogLabel &label, const char *fmt, ...)
        __attribute__((__format__(printf, 2, 3)));
    
    // 输出信息日志
    static int Info(const HiLogLabel &label, const char *fmt, ...)
        __attribute__((__format__(printf, 2, 3)));
    
    // 输出警告日志
    static int Warn(const HiLogLabel &label, const char *fmt, ...)
        __attribute__((__format__(printf, 2, 3)));
    
    // 输出错误日志
    static int Error(const HiLogLabel &label, const char *fmt, ...)
        __attribute__((__format__(printf, 2, 3)));
    
    // 输出致命日志
    static int Fatal(const HiLogLabel &label, const char *fmt, ...)
        __attribute__((__format__(printf, 2, 3)));
};

} // namespace HiviewDFX
} // namespace OHOS
2.2.4 核心函数

模块注册与管理

c 复制代码
// 注册模块信息
boolean HiLogRegisterModule(uint16 id, const char *name);

// 获取模块名称
const char *HiLogGetModuleName(uint8 id);

// 获取/设置日志级别
uint32 HiLogGetLogLevel(void);
boolean HiLogSetLogLevel(uint8 level);

日志输出

c 复制代码
// 轻量系统日志打印
void HiLogPrintf(uint8 module, uint8 level, const char *nums, 
    const char *fmt, ...);

// 小型系统日志打印
int HiLogPrint(LogType type, LogLevel level, unsigned int domain, 
    const char* tag, const char* fmt, ...);

// 带参数列表的日志打印
int HiLogPrintArgs(LogType bufID, LogLevel prio, unsigned int domain, 
    const char* tag, const char* fmt, va_list ap);

日志管理

c 复制代码
// 刷新日志缓冲区
void HiLogFlush(boolean syncFlag);
int FlushHilog(void);

// 日志输出到文件
void OutputLog(const uint8 *data, uint32 len);

// 日志格式化
int32 LogContentFmt(char *outStr, int32 outStrLen, const uint8 *pLogContent);

回调注册

c 复制代码
// 日志处理回调类型
typedef boolean (*HilogProc)(const HiLogContent *hilogContent, uint32 len);

// 注册/注销日志处理器
void HiLogRegisterProc(HilogProc func);
void HiLogUnRegisterProc(HilogProc func);

// 文件监控回调类型
typedef void (*FileProc)(const char *path, uint8 type, uint8 event);

// 注册/注销文件监控
void HiLogFileAddWatcher(FileProc func, const char *dest);
void HiLogFileRemoveWatcher(FileProc func);

2.3 类图

implements implements uses registered in contains contains extends <<interface>> IHiLog +Debug(fmt, ...) : int +Info(fmt, ...) : int +Warn(fmt, ...) : int +Error(fmt, ...) : int +Fatal(fmt, ...) : int HiLog +Debug(label, fmt, ...) : int +Info(label, fmt, ...) : int +Warn(label, fmt, ...) : int +Error(label, fmt, ...) : int +Fatal(label, fmt, ...) : int HiLogPrintf -module: uint8 -level: uint8 +HiLogPrintf(module, level, nums, fmt, ...) : void +HILOG_HashPrintf(...) : void HiLogLabel +type: LogType +domain: unsigned int +tag: const char* HiLogModuleInfo +id: uint16 +name: const char* HiLogManager -g_logModuleInfo[64]: HiLogModuleInfo -g_hiviewConfig: HiviewConfig -g_logCache: HiviewCache -g_logFile: HiviewFile +HiLogInit() : void +HiLogRegisterModule(id, name) : boolean +HiLogGetModuleName(id) +OutputLog(data, len) : void +FlushLog(syncFlag) : void HiLogCommon +head: uint8 +module: uint8 +level: uint8 +valueNumber: uint8 +task: uint8 +time: uint32 +milli: uint16 +fmt: const char* HiLogContent +commonContent: HiLogCommon +values[6]: uint32 HiLogLimitRule +maxNum: uint8 +logNum: uint8 +baseTime: uint16 +totalLogNum: uint32 +totalDropLogNum: uint32 HiviewConfig +outputOption: uint8 +hiviewInited: uint8 +level: uint8 +logSwitch: uint8 +eventSwitch: uint8 +dumpSwitch: uint8 +silenceMod: uint8 +logOutputModule[6]: char +writeFailureCount: uint16 HiLogEntry +len: unsigned int +hdrSize: unsigned int +pid: unsigned int +taskId: unsigned int +sec: unsigned int +nsec: unsigned int +reserved: unsigned int +msg[0]: char

2.4 模块内部依赖框图

服务层_services 框架层_frameworks mini子系统 featured子系统 JS子系统 接口层_interfaces 应用服务调用 hiview_logcat.c
日志实时查看
读取/dev/hilog
格式化输出到终端
支持级别/模块过滤 hiview_applogcat.c
日志落盘服务
读取/dev/hilog
写入日志文件
支持文件轮转 hilog_command.c
命令行参数处理
HilogCmdProc
FilterLevelLog
FilterModuleLog hilog_module.cpp hilog_string.cpp hilog_vector.cpp hilog.cpp
HiLog::Debug/Info/Warn/Error hiview_log.c
HiLogPrint/HiLogPrintArgs/FlushHilog hiview_log.c
HiLogInit/HiLogPrintf/Register hiview_output_log.c
OutputLog/LogContentFmt/FlushLog hiview_log_limit.c
LogIsLimited/SetLimitThreshold log.h
入口 hilog_cp.h
C++接口 hiview_log.h
核心定义 hilog_trace.h
追踪接口 应用/服务调用


3. 模块间交互

3.1 交互描述

3.1.1 与外部模块的交互
外部模块 交互方式 说明
hiview_lite 函数调用 获取配置、缓存管理、服务注册
samgr_lite 消息机制 通过SAMGR发送异步消息触发日志刷新
内核驱动 设备文件 通过/dev/hilog进行读写操作
bounds_checking_function 函数调用 使用安全字符串函数
3.1.2 异步处理机制

应用线程 Hiview服务 输出目标 HILOG_INFO(...) 写入缓存 (非阻塞) 继续执行业务... 缓存达到阈值 异步刷新到UART/文件 刷新完成 应用线程 Hiview服务 输出目标

3.1.3 多线程处理
  • 互斥锁保护 :使用 g_logFlushInfo.mutexg_outputLogInfo.mutex 保护关键资源
  • 原子操作 :使用 atomic_int 保护回调函数引用计数
  • 消息队列:通过 SAMGR 消息机制实现线程间通信

3.2 外部依赖框图

内核系统层 基础层 依赖模块 hilog_lite 上层调用者 内核/系统层
/dev/hilog
UART
文件系统 utils_lite
ohos_types.h
ohos_init.h hiview_lite
HiviewCache
HiviewFile
HiviewConfig
HiviewMutex samgr_lite
HiviewService
消息队列
服务注册 bounds_checking_function
snprintf_s
memcpy_s
strncpy_s
memset_s 核心功能
日志格式化
日志缓存
日志输出
限流控制 SAMGR ACE AAFWK MEDIA APP


4. 状态机转换图

4.1 状态机模型

HiLog_Lite 模块包含两个主要的状态机:

  1. 日志系统状态机:管理整个日志系统的生命周期
  2. 日志输出状态机:管理单条日志的处理流程

4.2 状态机树图

日志系统状态机层次树 输出模式子状态 系统状态 未初始化
UNINITED 已初始化
INITED 已关闭
CLOSED 空闲
IDLE 缓存中
CACHING 刷新中
FLUSHING DEBUG
调试输出 FLOW
流式输出 TEXT_FILE
文本文件 BIN_FILE
二进制文件

4.3 状态切换规则

4.3.1 系统状态转换
当前状态 触发事件 目标状态 转移条件
UNINITED HiLogInit() INITED 初始化成功
UNINITED HiLogInit() UNINITED 初始化失败
INITED ClearLogOutput() CLOSED 正常关闭
INITED 系统异常 CLOSED 异常退出
4.3.2 日志处理状态转换
当前状态 触发事件 目标状态 转移条件
IDLE HiLogPrintf() CACHING 有日志写入
CACHING 缓存满 FLUSHING usedSize >= 阈值
CACHING FlushLog() FLUSHING 手动刷新
FLUSHING 刷新完成 IDLE 缓存清空
FLUSHING 刷新失败 CACHING 重试

4.4 状态机转换图

系统启动 初始化失败 HiLogInit()
CORE_INIT_PRI() ClearLogOutput()
系统异常 UNINITED INITED HiLogPrintf() 缓存满/FlushLog() 完成 刷新失败(重试) 缓存未满 IDLE CACHING FLUSHING CLOSED

4.5 日志处理流程图

否 是 否 是 否 是 是 否 DEBUG 其他 失败 成功 否 是 开始 检查日志开关
logSwitch==ON? 丢弃日志 检查日志级别
level>=config? 丢弃日志 检查模块注册
module valid? 丢弃日志 检查限流状态
LogIsLimited? 丢弃日志
记录统计 格式化日志
填充HiLogContent 检查输出模式
outputOption? 直接UART输出 写入缓存
WriteToCache UART输出警告 缓存达到阈值?
usedSize>=BUF? 结束 发送刷新消息
HiviewSendMsg 结束 结束 结束 结束 结束 结束 结束


5. 接口设计

5.1 公共接口

5.1.1 C语言宏接口(轻量系统)
c 复制代码
/**
 * @brief 输出调试级别日志
 * @param mod 模块ID,类型为HiLogModuleType
 * @param fmt 格式化字符串,不支持%s,最多6个参数
 * @return 无返回值
 * @note 格式化后单条日志最大128字节
 */
#define HILOG_DEBUG(mod, fmt, ...)

/**
 * @brief 输出信息级别日志
 * @param mod 模块ID
 * @param fmt 格式化字符串
 */
#define HILOG_INFO(mod, fmt, ...)

/**
 * @brief 输出警告级别日志
 * @param mod 模块ID
 * @param fmt 格式化字符串
 */
#define HILOG_WARN(mod, fmt, ...)

/**
 * @brief 输出错误级别日志
 * @param mod 模块ID
 * @param fmt 格式化字符串
 */
#define HILOG_ERROR(mod, fmt, ...)

/**
 * @brief 输出致命级别日志
 * @param mod 模块ID
 * @param fmt 格式化字符串
 */
#define HILOG_FATAL(mod, fmt, ...)
5.1.2 C语言宏接口(小型系统)
c 复制代码
/**
 * @brief 输出调试级别日志
 * @param type 日志类型(LOG_CORE等)
 * @param fmt 格式化字符串,支持{public}/{private}隐私标记
 * @return 成功返回>=0,失败返回<0
 * @example HILOG_DEBUG(LOG_CORE, "value=%{public}d", value);
 */
#define HILOG_DEBUG(type, ...)

#define HILOG_INFO(type, ...)
#define HILOG_WARN(type, ...)
#define HILOG_ERROR(type, ...)
#define HILOG_FATAL(type, ...)
5.1.3 C++类接口
cpp 复制代码
namespace OHOS {
namespace HiviewDFX {

class HiLog {
public:
    /**
     * @brief 输出调试日志
     * @param label 日志标签,包含type、domain、tag
     * @param fmt 格式化字符串
     * @return 成功返回写入字节数,失败返回<0
     */
    static int Debug(const HiLogLabel &label, const char *fmt, ...);
    
    static int Info(const HiLogLabel &label, const char *fmt, ...);
    static int Warn(const HiLogLabel &label, const char *fmt, ...);
    static int Error(const HiLogLabel &label, const char *fmt, ...);
    static int Fatal(const HiLogLabel &label, const char *fmt, ...);
};

} // namespace HiviewDFX
} // namespace OHOS
5.1.4 模块管理接口
c 复制代码
/**
 * @brief 注册日志模块
 * @param id 模块ID,范围0-63
 * @param name 模块名称,最长15个字母
 * @return TRUE成功,FALSE失败
 * @note 未注册的模块无法输出日志
 */
boolean HiLogRegisterModule(uint16 id, const char *name);

/**
 * @brief 获取模块名称
 * @param id 模块ID
 * @return 模块名称字符串,无效ID返回空字符串
 */
const char *HiLogGetModuleName(uint8 id);

/**
 * @brief 获取当前日志级别
 * @return 当前配置的日志级别
 */
uint32 HiLogGetLogLevel(void);

/**
 * @brief 设置日志级别
 * @param level 日志级别,HILOG_LV_DEBUG到HILOG_LV_FATAL
 * @return TRUE成功,FALSE失败
 */
boolean HiLogSetLogLevel(uint8 level);
5.1.5 日志控制接口
c 复制代码
/**
 * @brief 刷新日志缓冲区
 * @param syncFlag TRUE同步刷新,FALSE异步刷新
 */
void HiLogFlush(boolean syncFlag);

/**
 * @brief 刷新日志到驱动(小型系统)
 * @return 写入字节数
 */
int FlushHilog(void);

/**
 * @brief 获取日志配置选项
 * @return 输出选项值
 */
uint32 HiLogGetConfigOption(void);
5.1.6 回调注册接口
c 复制代码
/**
 * @brief 日志处理回调函数类型
 * @param hilogContent 日志内容指针
 * @param len 日志长度
 * @return TRUE表示已处理,平台不再处理;FALSE继续处理
 */
typedef boolean (*HilogProc)(const HiLogContent *hilogContent, uint32 len);

/**
 * @brief 注册日志处理器
 * @param func 回调函数指针
 */
void HiLogRegisterProc(HilogProc func);

/**
 * @brief 注销日志处理器
 * @param func 回调函数指针
 */
void HiLogUnRegisterProc(HilogProc func);

/**
 * @brief 文件处理回调函数类型
 * @param path 文件路径
 * @param type 文件类型
 * @param event 事件类型,0表示文件满
 */
typedef void (*FileProc)(const char *path, uint8 type, uint8 event);

/**
 * @brief 添加日志文件监控
 * @param func 回调函数
 * @param dest 目标文件路径
 */
void HiLogFileAddWatcher(FileProc func, const char *dest);

/**
 * @brief 移除日志文件监控
 * @param func 回调函数
 */
void HiLogFileRemoveWatcher(FileProc func);

5.2 数据交换接口

5.2.1 设备驱动接口
c 复制代码
// 设备节点路径
#define HILOG_DRIVER "/dev/hilog"

// 日志条目结构(与驱动交互)
struct HiLogEntry {
    unsigned int len;           // 总长度
    unsigned int hdrSize;       // 头部大小
    unsigned int pid : 16;      // 进程ID
    unsigned int taskId : 16;   // 任务ID
    unsigned int sec;           // 时间戳(秒)
    unsigned int nsec;          // 纳秒
    unsigned int reserved;      // 保留
    char msg[0];                // 日志消息
};

// 读取日志
int fd = open(HILOG_DRIVER, O_RDONLY);
read(fd, buf, HILOG_LOGBUFFER);

// 写入日志
int fd = open(HILOG_DRIVER, O_WRONLY);
write(fd, buf, strlen(buf) + 1);
5.2.2 追踪ID接口
c 复制代码
/**
 * @brief 追踪ID获取函数类型
 * @param chainId 链路ID输出
 * @param flag 标志位输出
 * @param spanId SpanID输出
 * @param parentSpanId 父SpanID输出
 * @return 0成功,-1无效
 */
typedef int (*RegisterFunc)(uint64_t*, uint32_t*, uint64_t*, uint64_t*);

/**
 * @brief 注册追踪ID获取函数
 * @param registerFunc 回调函数
 * @return 0成功,-1失败
 */
int HiLogRegisterGetIdFun(RegisterFunc registerFunc);

/**
 * @brief 注销追踪ID获取函数
 * @param registerFunc 回调函数
 */
void HiLogUnregisterGetIdFun(RegisterFunc registerFunc);

5.3 接口调用时序图

5.3.1 日志输出时序图

应用模块 HiLog接口 日志核心 缓存管理 输出服务 HILOG_INFO() HiLogPrintf() CheckParameters() 返回检查结果 LogIsLimited() 返回限流状态 OutputLog() WriteToCache() 写入完成 检查缓存阈值 HiviewSendMsg() (异步刷新) alt [缓存达到阈- 值] 返回 应用模块 HiLog接口 日志核心 缓存管理 输出服务

5.3.2 日志查看时序图

用户 hilogcat 驱动节点 内核hilogtask hilogcat -L I HilogCmdProc() open(/dev/hilog) 返回fd read(fd, buf) 读取RingBuffer 返回日志数据 HiLogEntry FilterLevelLog() FilterModuleLog() printf(...) 日志输出 loop [循环读取] 用户 hilogcat 驱动节点 内核hilogtask

5.4 异常处理

异常场景 处理方式 返回值
模块未注册 丢弃日志
日志级别不足 丢弃日志
缓存写入失败 输出警告到UART
文件写入失败 增加失败计数,重试
参数个数超限 使用默认提示信息
格式化失败 返回错误码 -1
设备打开失败 返回0 0

附录

A. 编译配置选项

配置项 说明 默认值
HILOG_COMPILE_LEVEL 编译时日志级别 HILOG_LV_DEBUG
DISABLE_HILOG_CACHE 禁用日志缓存 未定义
DISABLE_HILOG_LITE_PRINT_LIMIT 禁用打印限流 未定义
DISABLE_HILOG_LITE_CORE_INIT 禁用自动初始化 未定义
OHOS_RELEASE 发布版本标记 未定义
DISABLE_HILOG_PRIVACY 禁用隐私保护 未定义

B. 使用示例

B.1 轻量系统使用示例
c 复制代码
#include "log.h"

// 1. 注册模块(如果是新模块)
HiLogRegisterModule(HILOG_MODULE_APP, "MYAPP");

// 2. 输出日志
HILOG_DEBUG(HILOG_MODULE_APP, "Debug message: %d", 100);
HILOG_INFO(HILOG_MODULE_APP, "Info message");
HILOG_ERROR(HILOG_MODULE_APP, "Error code: %d", errno);
B.2 小型系统使用示例
c 复制代码
#include <hilog/log.h>

// 1. 定义日志标签
#define LOG_DOMAIN 0x0001
#define LOG_TAG "MyModule"

// 2. 输出日志(支持隐私标记)
HILOG_INFO(LOG_CORE, "User name: %{private}s, age: %{public}d", name, age);
B.3 C++使用示例
cpp 复制代码
#include "hilog/log.h"

using namespace OHOS::HiviewDFX;

// 定义日志标签
static constexpr HiLogLabel LABEL = {LOG_CORE, 0x0001, "MyModule"};

// 输出日志
HiLog::Info(LABEL, "Info message: %{public}d", value);
HiLog::Error(LABEL, "Error occurred: %{public}s", errorMsg);
相关推荐
●VON6 小时前
小V健身助手开发手记(五):基于 RDB 的历史记录系统设计与实现
学习·openharmony·开源鸿蒙·von
小林up6 小时前
【MIT-OS6.S081作业-4-1】Lab4-traps-RISC-V assembly
操作系统·xv6
咘噜biu6 小时前
Java 安全的打印对象数据到日志
java·json·日志·脱敏
ikkkkkkkl21 小时前
进程同步与死锁
操作系统·进程
fakerth1 天前
【OpenHarmony】轻量级公共基础库commonlibrary_utils_lite
openharmony
_OP_CHEN1 天前
【Linux系统编程】(十五)揭秘 Linux 环境变量:从底层原理到实战操作,一篇吃透命令行参数与全局变量!
linux·运维·操作系统·bash·进程·环境变量·命令行参数
添砖java‘’2 天前
常见的进程间通信方式详解
linux·c++·操作系统·信息与通信·进程通信
西西弗Sisyphus2 天前
C++ 实现支持 32 位和 64 位进程的模块枚举
开发语言·c++·操作系统
鸿蒙小白龙2 天前
OpenHarmony LiteOS-A/M 版本迭代与演进对照
分布式·openharmony