news 2026/2/6 15:00:46

【OpenHarmony】日志服务hilog

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【OpenHarmony】日志服务hilog

HiLog 模块

1. 模块概述

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

1.1 功能与目标

主要功能:
HiLog是OpenHarmony操作系统的核心日志系统,为系统框架、服务和应用程序提供统一的日志打印、记录和管理功能。

核心目标:

  • 提供高效、可靠的日志记录机制
  • 支持多种日志类型(APP、CORE、INIT、KMSG)
  • 实现日志的分级管理(DEBUG/INFO/WARN/ERROR/FATAL)
  • 提供日志流控机制,防止日志打印过载
  • 支持日志落盘和压缩存储
  • 提供隐私保护机制

使用场景:

  • 应用程序运行状态记录
  • 系统框架调试信息输出
  • 用户操作行为追踪
  • 系统异常和错误记录
  • 性能分析和问题定位

1.2 系统位置

HiLog模块位于OpenHarmony DFX(Design For X)子系统中,是系统基础设施的核心组件。

角色定位:

  • 核心模块:为整个系统提供日志基础设施
  • 服务提供者:通过hilogd常驻服务提供日志收集和管理
  • 工具提供者:通过hilog命令行工具提供日志查询和控制

与其他模块的关系:

  • 依赖模块:bounds_checking_function、c_utils、ffrt、init、napi、zlib、runtime_core
  • 被依赖模块:几乎所有OpenHarmony子系统和应用

1.3 设计思路与模式

设计思路
  1. 客户端-服务端架构:采用C/S架构,客户端(应用进程)通过日志API发送日志,服务端(hilogd)负责收集、存储和管理日志。

  2. 环形缓冲区设计:使用Ring Buffer存储日志,实现高效的日志写入和读取。

  3. Socket通信机制:使用Unix Domain Socket实现进程间通信,确保日志传输的可靠性。

  4. 分层架构

    • 接口层:提供C/C++/JS/Rust多语言接口
    • 框架层:实现日志格式化和传输逻辑
    • 服务层:hilogd服务端实现日志管理
设计模式
设计模式应用场景说明
单例模式LogKmsg内核日志收集器使用单例确保唯一实例
工厂模式LogCompress根据压缩类型创建不同的压缩器实例
观察者模式HilogBuffer通过回调通知新日志数据到达
策略模式LogCompress支持不同压缩算法(None/Zlib/Zstd)
模板方法模式Socket定义Socket通信的基本流程

1.4 系统框图

OpenHarmony System
用户态进程
libhilog.so
hilogd (常驻服务)
hilog (命令行工具)
HiLog API
HiLog API
HiLog API
kmsg
Unix Domain Socket
Socket
Application
Process
C API
(log_c.h)
Framework
Process
C++ API
(log_cpp.h)
Service
Process
Kernel
LogKmsg
(内核日志)
Format
(vsnprintf)
Socket Client
LogCollector
(日志收集)
HilogBuffer
(环形缓冲区)
FlowControl
(流控)
LogStats
(统计信息)
LogPersister
(日志落盘)
LogCompress
(压缩)
ServiceController
(服务控制)
Log Query
(日志查询)
Log Display
(日志显示)
Log Control
(日志控制)
/data/log/hilog/
(日志落盘文件存储目录)

2. 模块结构

2.1 源文件与头文件

2.1.1 接口层 (interfaces/)
文件路径功能描述
interfaces/native/innerkits/include/hilog/log.h主头文件,包含C和C++接口
interfaces/native/innerkits/include/hilog/log_c.hC语言日志接口定义
interfaces/native/innerkits/include/hilog/log_cpp.hC++日志接口定义
interfaces/native/innerkits/include/hilog_base/log_base.h基础日志接口
interfaces/native/innerkits/include/hilog_trace.h日志追踪接口
interfaces/rust/src/lib.rsRust语言绑定
interfaces/js/kits/napi/JavaScript NAPI接口
2.1.2 框架层 (frameworks/)
文件路径功能描述
frameworks/libhilog/hilog.cppHiLog C++类实现
frameworks/libhilog/hilog_printf.cpp日志格式化打印实现
frameworks/libhilog/base/hilog_base.c基础日志功能实现
frameworks/libhilog/include/hilog_common.h公共定义和常量
frameworks/libhilog/include/hilog_cmd.h命令和协议定义
frameworks/libhilog/vsnprintf/vsnprintf_s_p.c安全格式化函数
frameworks/libhilog/param/properties.cpp属性配置管理
frameworks/libhilog/socket/*.cppSocket通信实现
frameworks/libhilog/utils/*.cpp工具函数
2.1.3 服务层 (services/)

hilogd服务:

文件路径功能描述
services/hilogd/main.cpp服务入口
services/hilogd/service_controller.cpp服务控制器
services/hilogd/log_collector.cpp日志收集器
services/hilogd/log_buffer.cpp环形缓冲区实现
services/hilogd/log_persister.cpp日志持久化
services/hilogd/log_compress.cpp日志压缩
services/hilogd/flow_control.cpp流量控制
services/hilogd/log_stats.cpp统计信息
services/hilogd/log_kmsg.cpp内核日志收集
services/hilogd/cmd_executor.cpp命令执行器

hilog工具:

文件路径功能描述
services/hilogtool/main.cpp工具入口和命令处理
services/hilogtool/log_display.cpp日志显示格式化

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

2.2.1 核心枚举类型
// 日志类型 (log_c.h)typedefenum{LOG_TYPE_MIN=0,LOG_APP=0,// 应用日志LOG_INIT=1,// 启动阶段日志LOG_CORE=3,// 核心服务/框架日志LOG_KMSG=4,// 内核日志LOG_ONLY_PRERELEASE=5,// 仅预发布版本LOG_TYPE_MAX}LogType;// 日志级别 (log_c.h)typedefenum{LOG_LEVEL_MIN=0,LOG_DEBUG=3,// 调试信息LOG_INFO=4,// 一般信息LOG_WARN=5,// 警告LOG_ERROR=6,// 错误LOG_FATAL=7,// 致命错误LOG_LEVEL_MAX,}LogLevel;// 控制命令 (hilog_cmd.h)enumclassIoctlCmd{INVALID=-1,OUTPUT_RQST=1,// 日志输出请求PERSIST_START_RQST,// 开始持久化PERSIST_STOP_RQST,// 停止持久化BUFFERSIZE_GET_RQST,// 获取缓冲区大小BUFFERSIZE_SET_RQST,// 设置缓冲区大小STATS_QUERY_RQST,// 查询统计信息// ... 更多命令};
2.2.2 核心结构体
// 日志标签 (log_cpp.h)usingHiLogLabel=struct{LogType type;// 日志类型unsignedintdomain;// 域IDconstchar*tag;// 标签};// 日志消息头 (hilog_cmd.h)structMsgHeader{uint8_tver;// 版本uint8_tcmd;// 命令int16_terr;// 错误码uint16_tlen;// 长度}__attribute__((__packed__));// 日志数据 (log_data.h)structHilogData{uint16_tlen;// 数据长度uint16_tversion:3;uint16_ttype:3;// 日志类型uint16_tlevel:4;// 日志级别uint16_ttagLen:6;// 标签长度uint32_ttv_sec;// 时间戳(秒)uint32_ttv_nsec;// 时间戳(纳秒)uint32_tmono_sec;// 单调时间uint32_tpid;// 进程IDuint32_ttid;// 线程IDuint32_tdomain;// 域IDchar*tag;// 标签指针char*content;// 内容指针};// 日志过滤器 (log_filter.h)structLogFilter{uint16_ttypes;// 类型过滤uint16_tlevels;// 级别过滤boolblackDomain;// 域黑名单模式uint8_tdomainCount;// 域数量uint32_tdomains[MAX_DOMAINS];// 域列表boolblackTag;// 标签黑名单模式uint8_ttagCount;// 标签数量chartags[MAX_TAGS][MAX_TAG_LEN];// 标签列表boolblackPid;// PID黑名单模式intpidCount;// PID数量uint32_tpids[MAX_PIDS];// PID列表charregex[MAX_REGEX_STR_LEN];// 正则表达式};
2.2.3 核心类

HiLog类 (C++接口)

namespaceOHOS::HiviewDFX{classHiLogfinal{public: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,...);};}

HilogBuffer类 (环形缓冲区)

classHilogBuffer{public:usingLogMsgContainer=std::list<HilogData>;usingReaderId=uintptr_t;HilogBuffer(boolisSupportSkipLog);~HilogBuffer();size_tInsert(constHilogMsg&msg,bool&isFull);std::optional<HilogData>Query(constLogFilter&filter,constReaderId&id,inttailCount=0);ReaderIdCreateBufReader(std::function<void()>onNewDataCallback);voidRemoveBufReader(constReaderId&id);int32_tDelete(uint16_tlogType);int64_tGetBuffLen(uint16_tlogType);int32_tSetBuffLen(uint16_tlogType,uint64_tbuffSize);private:size_t sizeByType[LOG_TYPE_MAX];LogMsgContainer hilogDataList;std::shared_mutex hilogBufferMutex;std::map<ReaderId,std::shared_ptr<BufferReader>>m_logReaders;};

LogCollector类 (日志收集器)

classLogCollector{public:explicitLogCollector(HilogBuffer&buffer);voidInsertDropInfo(constHilogMsg&msg,intdroppedCount);size_tInsertLogToBuffer(constHilogMsg&msg);voidonDataRecv(constucred&cred,std::vector<char>&data,intdataLen);voidSetLogFlowControl(boolon);voidSetDebuggable(boolon);private:HilogBuffer&m_hilogBuffer;boolcountEnable;boolflowControl;booldebug;};

LogPersister类 (日志持久化)

classLogPersister:publicstd::enable_shared_from_this<LogPersister>{public:staticstd::shared_ptr<LogPersister>CreateLogPersister(HilogBuffer&buffer);~LogPersister();staticintKill(uint32_tid);staticintQuery(std::list<LogPersistQueryResult>&results);staticintRefresh(uint32_tid);staticvoidClear();intInit(constPersistRecoveryInfo&msg,boolrestore);intDeinit();voidStart();voidStop();private:std::unique_ptr<LogCompress>m_compressor;std::unique_ptr<LogPersisterRotator>m_fileRotator;std::thread m_persisterThread;HilogBuffer&m_hilogBuffer;};

ServiceController类 (服务控制器)

classServiceController{public:staticconstexprintMAX_DATA_LEN=2048;ServiceController(std::unique_ptr<Socket>communicationSocket,LogCollector&collector,HilogBuffer&hilogBuffer,HilogBuffer&kmsgBuffer);~ServiceController();voidCommunicationLoop(std::atomic<bool>&stopLoop,constCmdList&list);private:voidHandleOutputRqst(constOutputRqst&rqst);voidHandlePersistStartRqst(constPersistStartRqst&rqst);voidHandleBufferSizeGetRqst(constBufferSizeGetRqst&rqst);voidHandleStatsQueryRqst(constStatsQueryRqst&rqst);// ... 更多处理函数std::unique_ptr<Socket>m_communicationSocket;LogCollector&m_logCollector;HilogBuffer&m_hilogBuffer;HilogBuffer&m_kmsgBuffer;};

LogCompress类 (日志压缩 - 策略模式)

classLogCompress{public:LogCompress()=default;virtual~LogCompress()=default;virtualintCompress(constLogPersisterBuffer&inBuffer,LogPersisterBuffer&compressBuffer)=0;staticstd::stringCompressType2Str(uint16_tcompressType);staticuint16_tStr2CompressType(conststd::string&str);};classNoneCompress:publicLogCompress{intCompress(...)override;};classZlibCompress:publicLogCompress{intCompress(...)override;};classZstdCompress:publicLogCompress{intCompress(...)override;};

Socket类 (网络通信)

classSocket{public:explicitSocket(intsocketType);~Socket();boolCloseHandler();intCreate();intWrite(constchar*data,unsignedintlen);intRead(char*buffer,unsignedintlen);protected:intsocketHandler;uint32_tsocketType;structucredsocketCred;};classSocketClient:publicSocket{public:SocketClient(std::string serverPath,uint32_tsocketType);intConnect();private:sockaddr_un serverAddr;};classSocketServer{public:SocketServer(conststd::string&socketName,uint32_tsocketType);intInit();intListen(unsignedintbacklog);intAccept();};
2.2.4 核心函数

C语言接口函数

// 日志打印intHiLogPrint(LogType type,LogLevel level,unsignedintdomain,constchar*tag,constchar*fmt,...);// 日志级别检查boolHiLogIsLoggable(unsignedintdomain,constchar*tag,LogLevel level);// 设置日志回调voidLOG_SetCallback(LogCallback callback);// 设置最低日志级别voidHiLogSetAppMinLogLevel(LogLevel level);// 获取最后一条致命日志constchar*GetLastFatalMessage(void);

宏定义接口

// C语言宏#defineHILOG_DEBUG(type,...)((void)HILOG_IMPL((type),LOG_DEBUG,LOG_DOMAIN,LOG_TAG,__VA_ARGS__))#defineHILOG_INFO(type,...)((void)HILOG_IMPL((type),LOG_INFO,LOG_DOMAIN,LOG_TAG,__VA_ARGS__))#defineHILOG_WARN(type,...)((void)HILOG_IMPL((type),LOG_WARN,LOG_DOMAIN,LOG_TAG,__VA_ARGS__))#defineHILOG_ERROR(type,...)((void)HILOG_IMPL((type),LOG_ERROR,LOG_DOMAIN,LOG_TAG,__VA_ARGS__))#defineHILOG_FATAL(type,...)((void)HILOG_IMPL((type),LOG_FATAL,LOG_DOMAIN,LOG_TAG,__VA_ARGS__))// C++宏#defineHiLogDebug(label,fmt,...)HILOG_IMPL(label.type,LOG_DEBUG,label.domain,label.tag,fmt,##__VA_ARGS__)#defineHiLogInfo(label,fmt,...)HILOG_IMPL(label.type,LOG_INFO,label.domain,label.tag,fmt,##__VA_ARGS__)#defineHiLogWarn(label,fmt,...)HILOG_IMPL(label.type,LOG_WARN,label.domain,label.tag,fmt,##__VA_ARGS__)#defineHiLogError(label,fmt,...)HILOG_IMPL(label.type,LOG_ERROR,label.domain,label.tag,fmt,##__VA_ARGS__)#defineHiLogFatal(label,fmt,...)HILOG_IMPL(label.type,LOG_FATAL,label.domain,label.tag,fmt,##__VA_ARGS__)

2.3 类图

uses
«final»
HiLog
+Debug(label, fmt, ...) : int
+Info(label, fmt, ...) : int
+Warn(label, fmt, ...) : int
+Error(label, fmt, ...) : int
+Fatal(label, fmt, ...) : int
HiLogLabel
+type : LogType
+domain : unsigned int
+tag : const char*
ServiceController
-m_communicationSocket : unique_ptr<Socket>
-m_logCollector : LogCollector&
-m_hilogBuffer : HilogBuffer&
-m_kmsgBuffer : HilogBuffer&
+CommunicationLoop(stopLoop, list) : void
+HandleOutputRqst(rqst) : void
+HandlePersistStartRqst(rqst) : void
LogCollector
-m_hilogBuffer : HilogBuffer&
-countEnable : bool
-flowControl : bool
-debug : bool
+InsertLogToBuffer(msg) : size_t
+onDataRecv(cred, data, dataLen) : void
+SetLogFlowControl(on) : void
HilogBuffer
-hilogDataList : LogMsgContainer
-sizeByType : size_t[]
-m_logReaders : map
+Insert(msg, isFull) : size_t
+Query(filter, id, tailCount) : optional<HilogData>
+CreateBufReader(callback) : ReaderId
+RemoveBufReader(id) : void
HilogData
+len : uint16_t
+type : uint16_t
+level : uint16_t
+tagLen : uint16_t
+tv_sec : uint32_t
+tv_nsec : uint32_t
+pid : uint32_t
+tid : uint32_t
+domain : uint32_t
+tag : char*
+content : char*
LogPersister
-m_compressor : unique_ptr<LogCompress>
-m_fileRotator : unique_ptr<LogPersisterRotator>
-m_hilogBuffer : HilogBuffer&
+CreateLogPersister(buffer) : shared_ptr<LogPersister>
+Init(msg, restore) : int
+Start() : void
+Stop() : void
«abstract»
LogCompress
+Compress(inBuffer, compressBuffer) : int
+CompressType2Str(compressType) : string
+Str2CompressType(str) : uint16_t
NoneCompress
+Compress(inBuffer, compressBuffer) : int
ZlibCompress
+Compress(inBuffer, compressBuffer) : int
ZstdCompress
+Compress(inBuffer, compressBuffer) : int
Socket
#socketHandler : int
#socketType : uint32_t
#socketCred : ucred
+Create() : int
+Write(data, len) : int
+Read(buffer, len) : int
+CloseHandler() : bool
SocketClient
-serverAddr : sockaddr_un
+Connect() : int
SocketServer
-socketHandler : int
-serverAddr : sockaddr_un
+Init() : int
+Listen(backlog) : int
+Accept() : int

2.4 模块内部依赖框图

services/ (服务层)
frameworks/ (框架层)
interfaces/ (接口层)
hilogd/
libhilog
socket/
include/
hilogtool/
main.cpp
log_display.cpp
main.cpp
log_collector.cpp
log_buffer.cpp
log_persister.cpp
log_compress.cpp
flow_control.cpp
log_stats.cpp
log_kmsg.cpp
service_controller.cpp
cmd_executor.cpp
hilog.cpp
hilog_printf.cpp
vsnprintf_s_p.c
properties.cpp
hilog_inner.h
hilog_common.h
hilog_cmd.h
hilog_base.h
socket.cpp
socket_client.cpp
hilog_input_socket_client.cpp
log.h
log_c.h
log_cpp.h

3. 模块间交互

3.1 交互描述

3.1.1 与应用进程的交互
  • 通信方式:Unix Domain Socket (SOCK_DGRAM)
  • Socket名称hilogInput
  • 数据格式:HilogMsg结构体
  • 交互流程:应用调用HiLog API → 格式化日志 → 通过Socket发送到hilogd
3.1.2 与hilog工具的交互
  • 输出SockethilogOutput(用于日志查询)
  • 控制SockethilogControl(用于配置和管理)
  • 通信协议:基于MsgHeader的请求-响应模式
3.1.3 与内核的交互
  • 交互方式:读取/dev/kmsg设备文件
  • 数据处理:LogKmsg类解析内核日志格式并转换为HilogData
3.1.4 外部依赖
依赖组件用途
bounds_checking_function安全字符串处理函数
c_utils基础工具函数
ffrt并发任务调度框架
init系统初始化和属性服务
napiNode.js Native API (JS接口)
zlib日志压缩
runtime_core运行时核心
3.1.5 多线程处理

hilogd服务使用多线程架构:

线程功能
主线程处理日志输出请求
控制线程处理配置和管理命令
日志收集线程接收应用日志
持久化线程日志落盘任务
Kmsg线程内核日志收集

3.2 外部依赖框图

文件系统
内核空间
HiLog Module
用户空间应用
libhilog.so
libhilog.so
napi
hilog_rust
libhilog.so
Unix Domain Socket
Socket
/data/log/hilog/
(日志落盘目录)
- hilog.000.20170805-170154.gz
- hilog_kmsg.000.20170805-170430.gz
/dev/kmsg
(内核日志设备)
hilogd
External Dependencies
zlib
(压缩)
ffrt
(并发)
c_utils
(工具)
init (系统属性服务)
- persist.sys.hilog.stats
- hilog.loggable.global
- hilog.private.on
bounds_checking_function
- strncpy_s, memcpy_s, sprintf_s ...
hilog
(命令行工具)
C API
C++ API
JS API
Rust API
Socket Client
Native App
JS App
Rust App
Framework

4. 状态机转换图

4.1 状态机模型

HiLog模块包含多个状态机,主要涉及:

  1. hilogd服务状态机
  2. 日志持久化任务状态机
  3. 流控状态机

4.2 状态机树图

HiLog System
hilogd Service State Machine
LogPersister Task State Machine
Flow Control State Machine
Buffer State Machine
Uninitialized (未初始化)
Initializing (初始化中)
Running (运行中)
Stopping (停止中)
Collecting (收集日志)
Processing (处理命令)
Persisting (持久化)
Idle (空闲)
Initializing (初始化中)
Running (运行中)
Refreshing (刷新中)
Stopped (已停止)
Receiving (接收日志)
Compressing (压缩)
Writing (写入文件)
Normal (正常)
Warning (警告)
Throttling (限流中)
Empty (空)
Available (可用)
Full (满)
Overflow (溢出)

4.3 状态切换规则

4.3.1 hilogd服务状态机
当前状态事件/条件目标状态动作
Uninitialized系统启动Initializing初始化资源
Initializing初始化完成Running启动服务循环
Initializing初始化失败Uninitialized清理资源
Running收到SIGINTStopping停止服务
Running收到日志Running处理日志
Stopping资源释放完成Uninitialized退出进程
4.3.2 日志持久化任务状态机
当前状态事件/条件目标状态动作
IdleStart命令Initializing创建文件和压缩器
Initializing初始化成功Running启动接收线程
Initializing初始化失败Idle清理资源
Running新日志到达Running写入日志
Running缓冲区满Running压缩并写入文件
RunningRefresh命令Refreshing刷新缓冲区
RunningStop命令Stopped停止线程
Refreshing刷新完成Running继续接收
StoppedStart命令Initializing重新初始化
4.3.3 流控状态机
当前状态事件/条件目标状态动作
Normal日志量 < 阈值Normal正常处理
Normal日志量 >= 警告阈值Warning记录警告
Warning日志量 >= 限流阈值Throttling开始丢弃日志
Warning日志量 < 警告阈值Normal恢复正常
Throttling日志量 < 限流阈值Warning减少丢弃
Throttling超时周期结束Normal重置计数

4.4 状态机转换图

4.4.1 hilogd服务状态机
系统启动
初始化失败
资源释放完成
初始化成功
SIGINT信号
Uninitialized
Initializing
Running
收到命令
命令处理完成
触发落盘
落盘完成
Collecting
Processing
Persisting
Stopping
4.4.2 日志持久化任务状态机
Start命令
初始化失败
Start命令
初始化成功
Refresh命令
刷新完成
Stop命令
Idle
Initializing
Running
缓冲区满
压缩完成
写入完成
Receiving
Compressing
Writing
Refreshing
Stopped
4.4.3 流控状态机
日志量 < 阈值
日志量 >= 警告阈值
日志量 < 警告阈值
日志量 >= 限流阈值
日志量 < 限流阈值
超时周期结束
继续丢弃日志
Normal
Warning
Throttling

5. 接口设计

5.1 公共接口

5.1.1 C语言接口

HiLogPrint - 日志打印

/** * @brief 打印日志 * @param type 日志类型 (LOG_APP/LOG_CORE/LOG_INIT等) * @param level 日志级别 (LOG_DEBUG/LOG_INFO/LOG_WARN/LOG_ERROR/LOG_FATAL) * @param domain 域ID (APP: 0-0xFFFF, CORE: 0xD000000-0xD0FFFFF) * @param tag 日志标签 * @param fmt 格式化字符串 * @return 成功返回写入字节数,失败返回-1 */intHiLogPrint(LogType type,LogLevel level,unsignedintdomain,constchar*tag,constchar*fmt,...);

HiLogIsLoggable - 检查日志级别

/** * @brief 检查指定域和标签的日志是否可打印 * @param domain 域ID * @param tag 日志标签 * @param level 日志级别 * @return true: 可打印, false: 不可打印 */boolHiLogIsLoggable(unsignedintdomain,constchar*tag,LogLevel level);

LOG_SetCallback - 设置日志回调

/** * @brief 设置用户自定义日志处理回调 * @param callback 回调函数指针,NULL表示取消回调 * @since 11 */voidLOG_SetCallback(LogCallback callback);// 回调函数类型定义typedefvoid(*LogCallback)(constLogType type,constLogLevel level,constunsignedintdomain,constchar*tag,constchar*msg);

HiLogSetAppMinLogLevel - 设置最低日志级别

/** * @brief 设置应用进程的最低日志级别 * @param level 日志级别 * @since 15 */voidHiLogSetAppMinLogLevel(LogLevel level);

GetLastFatalMessage - 获取最后一条致命日志

/** * @brief 获取最后一条FATAL级别日志 * @return 日志内容字符串 */constchar*GetLastFatalMessage(void);
5.1.2 C++接口

HiLog类静态方法

namespaceOHOS::HiviewDFX{classHiLogfinal{public:/** * @brief 打印DEBUG级别日志 * @param label 日志标签结构体 * @param fmt 格式化字符串 * @return 成功返回写入字节数,失败返回-1 */staticintDebug(constHiLogLabel&label,constchar*fmt,...);/** * @brief 打印INFO级别日志 */staticintInfo(constHiLogLabel&label,constchar*fmt,...);/** * @brief 打印WARN级别日志 */staticintWarn(constHiLogLabel&label,constchar*fmt,...);/** * @brief 打印ERROR级别日志 */staticintError(constHiLogLabel&label,constchar*fmt,...);/** * @brief 打印FATAL级别日志 */staticintFatal(constHiLogLabel&label,constchar*fmt,...);};}
5.1.3 宏接口

C语言宏

// 使用前需定义 LOG_DOMAIN 和 LOG_TAG#defineLOG_DOMAIN0x0001#defineLOG_TAG"MyModule"// 日志打印宏HILOG_DEBUG(LOG_CORE,"Debug message: %{public}d",value);HILOG_INFO(LOG_CORE,"Info message: %{public}s",str);HILOG_WARN(LOG_CORE,"Warning message");HILOG_ERROR(LOG_CORE,"Error message: %{private}s",privateData);HILOG_FATAL(LOG_CORE,"Fatal error!");

C++宏

// 定义日志标签constexprHiLogLabel LABEL={LOG_CORE,0xD001234,"MyModule"};// 日志打印宏HiLogDebug(LABEL,"Debug: %{public}d",value);HiLogInfo(LABEL,"Info: %{public}s",str);HiLogWarn(LABEL,"Warning");HiLogError(LABEL,"Error: %{private}s",data);HiLogFatal(LABEL,"Fatal!");

5.2 数据交换接口

5.2.1 Socket通信协议

消息头格式

structMsgHeader{uint8_tver;// 协议版本,当前为0uint8_tcmd;// 命令类型 (IoctlCmd枚举值)int16_terr;// 错误码uint16_tlen;// 数据长度}__attribute__((__packed__));

日志输出请求/响应

// 请求structOutputRqst{uint16_theadLines;// 显示头部行数uint16_ttypes;// 日志类型过滤uint16_tlevels;// 日志级别过滤boolblackDomain;// 域黑名单模式uint8_tdomainCount;// 域数量uint32_tdomains[MAX_DOMAINS];// 域列表boolblackTag;// 标签黑名单模式uint8_ttagCount;// 标签数量chartags[MAX_TAGS][MAX_TAG_LEN];// 标签列表boolblackPid;// PID黑名单模式intpidCount;// PID数量uint32_tpids[MAX_PIDS];// PID列表charregex[MAX_REGEX_STR_LEN];// 正则表达式boolnoBlock;// 非阻塞模式uint16_ttailLines;// 显示尾部行数}__attribute__((__packed__));// 响应structOutputRsp{uint16_tlen;// 数据长度uint8_tlevel;// 日志级别uint8_ttype;// 日志类型uint32_tpid;// 进程IDuint32_ttid;// 线程IDuint32_tdomain;// 域IDuint32_ttv_sec;// 时间戳(秒)uint32_ttv_nsec;// 时间戳(纳秒)uint32_tmono_sec;// 单调时间uint8_ttagLen;// 标签长度boolend;// 是否结束chardata[];// 标签和内容}__attribute__((__packed__));

持久化任务请求/响应

// 开始持久化请求structPersistStartRqst{OutputRqst outputFilter;// 日志过滤条件uint32_tjobId;// 任务IDuint32_tfileSize;// 单文件大小uint16_tfileNum;// 文件数量charfileName[MAX_FILE_NAME_LEN];// 文件名charstream[MAX_STREAM_NAME_LEN];// 压缩算法}__attribute__((__packed__));// 停止持久化请求structPersistStopRqst{uint32_tjobId;// 任务ID (0表示停止所有)}__attribute__((__packed__));

5.3 接口调用时序图

5.3.1 日志打印时序图
App Processlibhilog.soSocket Clienthilogd ServiceHilogBufferHiLogPrint()Format LogSend formatted logUnix Domain SocketInsert()Notify ReaderSuccessACKReturnreturn bytesApp Processlibhilog.soSocket Clienthilogd ServiceHilogBuffer
5.3.2 日志查询时序图
hilog ToolLogIoctlSocket Clienthilogd ServiceHilogBufferQueryLog()OutputRqstConnect()Send RequestQuery()HilogDataOutputRspOutputRspDisplay LogQuery()HilogDataOutputRspOutputRspDisplay Logloop[Until end=true]hilog ToolLogIoctlSocket Clienthilogd ServiceHilogBuffer
5.3.3 持久化任务启动时序图
hilog ToolLogIoctlhilogd ServiceLogPersisterLogCompress-w startPersistStartRqstCreateLogPersister()InitCompression()CompressorInit()Start()Start ThreadPersistStartRspJob Startedhilog ToolLogIoctlhilogd ServiceLogPersisterLogCompress
5.3.4 hilogd服务启动时序图
main()HilogBufferLogCollectorInputServerCmdExecutorCreate BufferCreate CollectorCreate InputServerInit()RunServingThread()Create CmdExecutor (Control)Start ThreadCreate CmdExecutor (Output)MainLoop()Loopmain()HilogBufferLogCollectorInputServerCmdExecutor

附录

A. 常量定义

常量名说明
MAX_LOG_LEN4096单条日志最大长度
MAX_TAG_LEN32标签最大长度
MAX_DOMAINS5最大域过滤数量
MAX_TAGS10最大标签过滤数量
MAX_PIDS5最大PID过滤数量
MIN_BUFFER_SIZE64KB缓冲区最小大小
MAX_BUFFER_SIZE16MB缓冲区最大大小
MIN_LOG_FILE_SIZE64KB日志文件最小大小
MAX_LOG_FILE_SIZE512MB日志文件最大大小
MIN_LOG_FILE_NUM2最小日志文件数量
MAX_LOG_FILE_NUM1000最大日志文件数量
DOMAIN_OS_MIN0xD000000系统域ID最小值
DOMAIN_OS_MAX0xD0FFFFF系统域ID最大值
DOMAIN_APP_MIN0x0应用域ID最小值
DOMAIN_APP_MAX0xFFFF应用域ID最大值

B. 错误码定义

错误码说明
RET_SUCCESS0成功
RET_FAIL-1失败
ERR_LOG_LEVEL_INVALID-2无效的日志级别
ERR_LOG_TYPE_INVALID-3无效的日志类型
ERR_INVALID_RQST_CMD-4无效的请求命令
ERR_DOMAIN_INVALID-19无效的域ID
ERR_MSG_LEN_INVALID-21无效的消息长度
ERR_BUFF_SIZE_INVALID-30无效的缓冲区大小
ERR_SOCKET_CLIENT_INIT_FAIL-46Socket客户端初始化失败

C. hilog命令行参数

参数说明
-h, --help显示帮助信息
-x, --exit非阻塞读取日志
-a, --head=<n>显示前n行日志
-z, --tail=<n>显示后n行日志
-t, --type=<type>指定日志类型
-L, --level=<level>指定日志级别
-D, --domain=<domain>指定域ID
-T, --tag=<tag>指定标签
-P, --pid=<pid>指定进程ID
-e, --regex=<expr>正则表达式过滤
-r清除缓冲区日志
-g查询缓冲区大小
-G, --buffer-size=<size>设置缓冲区大小
-s, --statistics查询统计信息
-S清除统计信息
-w, --write=<control>落盘任务控制
-b, --baselevel=<level>设置日志级别
-p, --privacy=<on/off>隐私开关控制
-k, --kmsg=<on/off>内核日志开关
-Q <control-type>流控开关控制
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 5:37:38

Dify版本回滚从入门到精通:一套被验证的标准化操作流程

第一章&#xff1a;Dify工作流版本回滚的核心概念在Dify平台中&#xff0c;工作流版本回滚是一项关键的运维能力&#xff0c;允许开发者在部署新版本后遇到异常时&#xff0c;快速恢复至先前稳定的状态。该机制依赖于版本控制系统与部署流水线的深度集成&#xff0c;确保每一次…

作者头像 李华
网站建设 2026/2/4 8:07:09

Frdbio®小鼠抗体纯化试剂盒

产品介绍&#xff1a;Frdbio 小鼠抗体纯化试剂盒用于纯化小鼠血清,腹水和含有鼠源抗体的制品;本试剂盒配备了纯化小鼠抗体所必需预装柱及核心试剂。本试剂盒中预装柱的填料为Protein G Beads 4FF。主要优势如下&#xff1a;本蛋白纯化试剂特点&#xff1a; Protein G Beads 4F…

作者头像 李华
网站建设 2026/2/5 21:38:23

告别冗余加载:构建高效量子计算运行时环境的6个不可忽视步骤

第一章&#xff1a;量子计算镜像的依赖精简在构建面向量子计算模拟器的容器化运行环境时&#xff0c;镜像体积与依赖复杂度直接影响部署效率和安全性。通过精简不必要的系统库和开发工具链&#xff0c;可以显著提升镜像启动速度并降低攻击面。依赖分析与最小化策略 采用静态分析…

作者头像 李华
网站建设 2026/2/6 12:01:30

Agent服务扩展难题,如何在Docker Compose中实现无缝横向扩容?

第一章&#xff1a;Agent服务扩展难题&#xff0c;如何在Docker Compose中实现无缝横向扩容&#xff1f;在微服务架构中&#xff0c;Agent类服务常用于采集日志、监控指标或执行远程指令。随着业务规模增长&#xff0c;单实例Agent难以应对高并发任务&#xff0c;亟需通过横向扩…

作者头像 李华
网站建设 2026/2/6 6:01:40

PageAdmin:为企业政务提供产品及解决方案

PageAdmin专注于网站内容管理系统、SSO单点登录、统一身份认证平台及低代码平台的研发&#xff0c;凭借成熟的技术体系与丰富的实践经验&#xff0c;致力于为各类组织的网站建设和统一数字化信息平台搭建提供企业级解决方案&#xff0c;助力企业高效推进数字化转型。一、核心产…

作者头像 李华
网站建设 2026/2/4 20:40:38

国产数据库技术学习心得:DM 数据库从实操到应用

在《国产数据库技术》课程学习中&#xff0c;我以达梦数据库&#xff08;DM&#xff09;为核心&#xff0c;系统掌握了国产数据库的安装配置、数据管理及开发应用能力。从最初对国产数据库的陌生&#xff0c;到能独立完成实例部署与 SQL 程序设计&#xff0c;每一次实操都让我深…

作者头像 李华