HiLog_Lite 模块
目录
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 设计思路与模式
设计思路
-
分层架构:
- 接口层:提供统一的日志API(C/C++/JS)
- 框架层:实现日志格式化、缓存、输出逻辑
- 服务层:提供日志查看和落盘服务
- 驱动层:内核态日志处理
-
双系统支持:
- mini系统:针对资源受限的LiteOS-M,使用纯C实现
- featured系统:针对LiteOS-A,支持C++接口和更多特性
-
异步处理:
- 日志先写入缓存,异步刷新到文件/UART
- 减少日志操作对主业务的阻塞
设计模式
-
单例模式(Singleton):
- 全局配置对象
g_hiviewConfig - 日志缓存对象
g_logCache
- 全局配置对象
-
观察者模式(Observer):
- 日志文件监控:
HiLogFileAddWatcher/HiLogFileRemoveWatcher - 支持注册回调函数处理日志事件
- 日志文件监控:
-
策略模式(Strategy):
- 多种输出策略:DEBUG输出、FLOW输出、TEXT_FILE、BIN_FILE
- 通过配置选择不同的输出策略
-
生产者-消费者模式:
- 日志产生方(各模块)作为生产者
- 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.mutex和g_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 模块包含两个主要的状态机:
- 日志系统状态机:管理整个日志系统的生命周期
- 日志输出状态机:管理单条日志的处理流程
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);