news 2026/2/19 9:46:02

【OpenHarmony】日志服务hilog_lite

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【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.hC++类接口定义(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 核心枚举类型
// 日志模块类型(轻量系统)typedefenum{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;// 日志级别(小型系统)typedefenum{LOG_DEBUG=3,// 调试级别LOG_INFO=4,// 信息级别LOG_WARN=5,// 警告级别LOG_ERROR=6,// 错误级别LOG_FATAL=7,// 致命级别}LogLevel;// 日志类型typedefenum{LOG_TYPE_MIN=0,LOG_INIT=1,// 初始化阶段日志LOG_CORE=3,// 核心服务日志LOG_TYPE_MAX}LogType;
2.2.2 核心结构体
// 日志通用头信息(轻量系统)#pragmapack(1)typedefstruct{uint8 head;// 日志头标识uint8 module;// 模块IDuint8 level:4;// 日志级别uint8 valueNumber:4;// 参数个数uint8 task;// 任务IDuint32 time;// 时间戳(秒)uint16 milli;// 毫秒constchar*fmt;// 格式化字符串}HiLogCommon;// 日志内容typedefstruct{HiLogCommon commonContent;uint32 values[LOG_MULTI_PARA_MAX];// 参数值(最多6个)}HiLogContent;#pragmapack()// 日志条目(小型系统)structHiLogEntry{unsignedintlen;// 日志长度unsignedinthdrSize;// 头部大小unsignedintpid:16;// 进程IDunsignedinttaskId:16;// 任务IDunsignedintsec;// 时间戳(秒)unsignedintnsec;// 纳秒unsignedintreserved;// 保留字段charmsg[0];// 日志消息(柔性数组)};// 日志限流规则typedefstruct{uint8 maxNum;// 最大日志行数限制uint8 logNum;// 当前日志计数uint16 baseTime;// 基准时间uint32 totalLogNum;// 总日志数uint32 totalDropLogNum;// 丢弃日志数}HiLogLimitRule;// 配置结构体typedefstruct{constunsignedcharoutputOption:4;// 输出选项unsignedcharhiviewInited:1;// 初始化标志unsignedcharlevel:3;// 日志级别unsignedcharlogSwitch:1;// 日志开关unsignedchareventSwitch:1;// 事件开关unsignedchardumpSwitch:1;// dump开关unsignedcharsilenceMod:1;// 静默模式charlogOutputModule[6];// 输出模块过滤unsignedshortwriteFailureCount;// 写入失败计数}HiviewConfig;
2.2.3 C++ 类定义
namespaceOHOS{namespaceHiviewDFX{// 日志标签结构structHiLogLabel{LogType type;// 日志类型unsignedintdomain;// 领域IDconstchar*tag;// 日志标签};// HiLog 类(静态方法类)classHiLogfinal{public:// 输出调试日志staticintDebug(constHiLogLabel&label,constchar*fmt,...)__attribute__((__format__(printf,2,3)));// 输出信息日志staticintInfo(constHiLogLabel&label,constchar*fmt,...)__attribute__((__format__(printf,2,3)));// 输出警告日志staticintWarn(constHiLogLabel&label,constchar*fmt,...)__attribute__((__format__(printf,2,3)));// 输出错误日志staticintError(constHiLogLabel&label,constchar*fmt,...)__attribute__((__format__(printf,2,3)));// 输出致命日志staticintFatal(constHiLogLabel&label,constchar*fmt,...)__attribute__((__format__(printf,2,3)));};}// namespace HiviewDFX}// namespace OHOS
2.2.4 核心函数

模块注册与管理

// 注册模块信息booleanHiLogRegisterModule(uint16 id,constchar*name);// 获取模块名称constchar*HiLogGetModuleName(uint8 id);// 获取/设置日志级别uint32HiLogGetLogLevel(void);booleanHiLogSetLogLevel(uint8 level);

日志输出

// 轻量系统日志打印voidHiLogPrintf(uint8 module,uint8 level,constchar*nums,constchar*fmt,...);// 小型系统日志打印intHiLogPrint(LogType type,LogLevel level,unsignedintdomain,constchar*tag,constchar*fmt,...);// 带参数列表的日志打印intHiLogPrintArgs(LogType bufID,LogLevel prio,unsignedintdomain,constchar*tag,constchar*fmt,va_list ap);

日志管理

// 刷新日志缓冲区voidHiLogFlush(boolean syncFlag);intFlushHilog(void);// 日志输出到文件voidOutputLog(constuint8*data,uint32 len);// 日志格式化int32LogContentFmt(char*outStr,int32 outStrLen,constuint8*pLogContent);

回调注册

// 日志处理回调类型typedefboolean(*HilogProc)(constHiLogContent*hilogContent,uint32 len);// 注册/注销日志处理器voidHiLogRegisterProc(HilogProc func);voidHiLogUnRegisterProc(HilogProc func);// 文件监控回调类型typedefvoid(*FileProc)(constchar*path,uint8 type,uint8 event);// 注册/注销文件监控voidHiLogFileAddWatcher(FileProc func,constchar*dest);voidHiLogFileRemoveWatcher(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 系统状态转换
当前状态触发事件目标状态转移条件
UNINITEDHiLogInit()INITED初始化成功
UNINITEDHiLogInit()UNINITED初始化失败
INITEDClearLogOutput()CLOSED正常关闭
INITED系统异常CLOSED异常退出
4.3.2 日志处理状态转换
当前状态触发事件目标状态转移条件
IDLEHiLogPrintf()CACHING有日志写入
CACHING缓存满FLUSHINGusedSize >= 阈值
CACHINGFlushLog()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语言宏接口(轻量系统)
/** * @brief 输出调试级别日志 * @param mod 模块ID,类型为HiLogModuleType * @param fmt 格式化字符串,不支持%s,最多6个参数 * @return 无返回值 * @note 格式化后单条日志最大128字节 */#defineHILOG_DEBUG(mod,fmt,...)/** * @brief 输出信息级别日志 * @param mod 模块ID * @param fmt 格式化字符串 */#defineHILOG_INFO(mod,fmt,...)/** * @brief 输出警告级别日志 * @param mod 模块ID * @param fmt 格式化字符串 */#defineHILOG_WARN(mod,fmt,...)/** * @brief 输出错误级别日志 * @param mod 模块ID * @param fmt 格式化字符串 */#defineHILOG_ERROR(mod,fmt,...)/** * @brief 输出致命级别日志 * @param mod 模块ID * @param fmt 格式化字符串 */#defineHILOG_FATAL(mod,fmt,...)
5.1.2 C语言宏接口(小型系统)
/** * @brief 输出调试级别日志 * @param type 日志类型(LOG_CORE等) * @param fmt 格式化字符串,支持{public}/{private}隐私标记 * @return 成功返回>=0,失败返回<0 * @example HILOG_DEBUG(LOG_CORE, "value=%{public}d", value); */#defineHILOG_DEBUG(type,...)#defineHILOG_INFO(type,...)#defineHILOG_WARN(type,...)#defineHILOG_ERROR(type,...)#defineHILOG_FATAL(type,...)
5.1.3 C++类接口
namespaceOHOS{namespaceHiviewDFX{classHiLog{public:/** * @brief 输出调试日志 * @param label 日志标签,包含type、domain、tag * @param fmt 格式化字符串 * @return 成功返回写入字节数,失败返回<0 */staticintDebug(constHiLogLabel&label,constchar*fmt,...);staticintInfo(constHiLogLabel&label,constchar*fmt,...);staticintWarn(constHiLogLabel&label,constchar*fmt,...);staticintError(constHiLogLabel&label,constchar*fmt,...);staticintFatal(constHiLogLabel&label,constchar*fmt,...);};}// namespace HiviewDFX}// namespace OHOS
5.1.4 模块管理接口
/** * @brief 注册日志模块 * @param id 模块ID,范围0-63 * @param name 模块名称,最长15个字母 * @return TRUE成功,FALSE失败 * @note 未注册的模块无法输出日志 */booleanHiLogRegisterModule(uint16 id,constchar*name);/** * @brief 获取模块名称 * @param id 模块ID * @return 模块名称字符串,无效ID返回空字符串 */constchar*HiLogGetModuleName(uint8 id);/** * @brief 获取当前日志级别 * @return 当前配置的日志级别 */uint32HiLogGetLogLevel(void);/** * @brief 设置日志级别 * @param level 日志级别,HILOG_LV_DEBUG到HILOG_LV_FATAL * @return TRUE成功,FALSE失败 */booleanHiLogSetLogLevel(uint8 level);
5.1.5 日志控制接口
/** * @brief 刷新日志缓冲区 * @param syncFlag TRUE同步刷新,FALSE异步刷新 */voidHiLogFlush(boolean syncFlag);/** * @brief 刷新日志到驱动(小型系统) * @return 写入字节数 */intFlushHilog(void);/** * @brief 获取日志配置选项 * @return 输出选项值 */uint32HiLogGetConfigOption(void);
5.1.6 回调注册接口
/** * @brief 日志处理回调函数类型 * @param hilogContent 日志内容指针 * @param len 日志长度 * @return TRUE表示已处理,平台不再处理;FALSE继续处理 */typedefboolean(*HilogProc)(constHiLogContent*hilogContent,uint32 len);/** * @brief 注册日志处理器 * @param func 回调函数指针 */voidHiLogRegisterProc(HilogProc func);/** * @brief 注销日志处理器 * @param func 回调函数指针 */voidHiLogUnRegisterProc(HilogProc func);/** * @brief 文件处理回调函数类型 * @param path 文件路径 * @param type 文件类型 * @param event 事件类型,0表示文件满 */typedefvoid(*FileProc)(constchar*path,uint8 type,uint8 event);/** * @brief 添加日志文件监控 * @param func 回调函数 * @param dest 目标文件路径 */voidHiLogFileAddWatcher(FileProc func,constchar*dest);/** * @brief 移除日志文件监控 * @param func 回调函数 */voidHiLogFileRemoveWatcher(FileProc func);

5.2 数据交换接口

5.2.1 设备驱动接口
// 设备节点路径#defineHILOG_DRIVER"/dev/hilog"// 日志条目结构(与驱动交互)structHiLogEntry{unsignedintlen;// 总长度unsignedinthdrSize;// 头部大小unsignedintpid:16;// 进程IDunsignedinttaskId:16;// 任务IDunsignedintsec;// 时间戳(秒)unsignedintnsec;// 纳秒unsignedintreserved;// 保留charmsg[0];// 日志消息};// 读取日志intfd=open(HILOG_DRIVER,O_RDONLY);read(fd,buf,HILOG_LOGBUFFER);// 写入日志intfd=open(HILOG_DRIVER,O_WRONLY);write(fd,buf,strlen(buf)+1);
5.2.2 追踪ID接口
/** * @brief 追踪ID获取函数类型 * @param chainId 链路ID输出 * @param flag 标志位输出 * @param spanId SpanID输出 * @param parentSpanId 父SpanID输出 * @return 0成功,-1无效 */typedefint(*RegisterFunc)(uint64_t*,uint32_t*,uint64_t*,uint64_t*);/** * @brief 注册追踪ID获取函数 * @param registerFunc 回调函数 * @return 0成功,-1失败 */intHiLogRegisterGetIdFun(RegisterFunc registerFunc);/** * @brief 注销追踪ID获取函数 * @param registerFunc 回调函数 */voidHiLogUnregisterGetIdFun(RegisterFunc registerFunc);

5.3 接口调用时序图

5.3.1 日志输出时序图
应用模块HiLog接口日志核心缓存管理输出服务HILOG_INFO()HiLogPrintf()CheckParameters()返回检查结果LogIsLimited()返回限流状态OutputLog()WriteToCache()写入完成检查缓存阈值HiviewSendMsg()(异步刷新)alt[缓存达到阈-值]返回应用模块HiLog接口日志核心缓存管理输出服务
5.3.2 日志查看时序图
用户hilogcat驱动节点内核hilogtaskhilogcat -L IHilogCmdProc()open(/dev/hilog)返回fdread(fd, buf)读取RingBuffer返回日志数据HiLogEntryFilterLevelLog()FilterModuleLog()printf(...)日志输出loop[循环读取]用户hilogcat驱动节点内核hilogtask

5.4 异常处理

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

附录

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 轻量系统使用示例
#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 小型系统使用示例
#include<hilog/log.h>// 1. 定义日志标签#defineLOG_DOMAIN0x0001#defineLOG_TAG"MyModule"// 2. 输出日志(支持隐私标记)HILOG_INFO(LOG_CORE,"User name: %{private}s, age: %{public}d",name,age);
B.3 C++使用示例
#include"hilog/log.h"usingnamespaceOHOS::HiviewDFX;// 定义日志标签staticconstexprHiLogLabel LABEL={LOG_CORE,0x0001,"MyModule"};// 输出日志HiLog::Info(LABEL,"Info message: %{public}d",value);HiLog::Error(LABEL,"Error occurred: %{public}s",errorMsg);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/16 17:21:37

彻底搞定transformer模型原理及代码!

&#x1f449;学会后的收获&#xff1a;&#x1f448; • 基于大模型全栈工程实现&#xff08;前端、后端、产品经理、设计、数据分析等&#xff09;&#xff0c;通过这门课可获得不同能力&#xff1b; • 能够利用大模型解决相关实际项目需求&#xff1a; 大数据时代&#x…

作者头像 李华
网站建设 2026/2/12 7:15:36

环境监测采样设计避坑指南(R语言实操经验大公开)

第一章&#xff1a;环境监测采样设计的核心挑战 在环境监测中&#xff0c;采样设计是确保数据代表性与科学性的关键环节。不合理的采样策略可能导致数据偏差&#xff0c;进而影响污染评估、政策制定和治理措施的有效性。面对复杂多变的自然环境与人为干扰因素&#xff0c;采样设…

作者头像 李华
网站建设 2026/2/14 5:28:01

基于Spring Boot+Vue的房产租赁管理系统

目录 项目介绍 演示视频 系统展示 代码实现 推荐项目 项目开发总结 为什么选择我 源码获取 博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领…

作者头像 李华
网站建设 2026/2/16 12:18:16

基于 MATLAB 的光照不均匀图像增强

基于 MATLAB 的光照不均匀图像增强程序&#xff0c;结合了同态滤波和高斯高通滤波的方法。该程序通过对图像进行对数变换、傅里叶变换、滤波处理&#xff0c;最后通过逆变换恢复图像&#xff0c;从而增强光照不均匀的图像。 MATLAB 代码实现 function enhanced_image homomorp…

作者头像 李华
网站建设 2026/2/14 20:48:47

【Dify自动化进阶必修课】:条件判断逻辑优化的9个关键细节

第一章&#xff1a;Dify工作流中条件判断的核心机制 在Dify平台的工作流系统中&#xff0c;条件判断是实现流程分支控制的关键机制。它允许开发者根据运行时的变量值动态决定执行路径&#xff0c;从而构建灵活、智能的自动化流程。 条件节点的基本结构 条件节点通过表达式评估…

作者头像 李华