最小用法

xrtLogAttach 增加 Sink 引用,因此调用方可以在附加后立即释放自己的引用。一个 Sink 可以同时附加到多个 Logger。

结果

  • XLOG_RESULT_SKIPPED:被 Logger 或 Sink 阈值过滤,或者 Logger 没有 Sink。
  • XLOG_RESULT_WRITTEN:至少一个 Sink 完成写入。
  • XLOG_RESULT_DROPPED:没有写入,但至少一个 Sink 按自身策略主动丢弃。
  • XLOG_RESULT_ERROR:至少一个 Sink 发生真实错误;其余 Sink 仍会收到记录。

成功、过滤和主动丢弃不会覆盖调用者已有的线程错误。回调返回错误但没有设置具体错误时,核心建立 xrt.log 错误。

记录和字段

xlogrecord、xlogfield 中的视图和错误对象全部是借用值,只保证在提交调用期间有效。同步 Sink 必须在回调返回前消费数据;异步 Sink 必须深复制记录。

核心不强制验证 UTF-8。文本和 JSON 格式化层分别定义自己的编码契约,因此自定义二进制或转发 Sink 不会被核心限制。

printf Helper

启用 logger_printf 后,可以使用 xrtLogPrintf、xrtLogFieldsPrintf 和 xrtLogSourcePrintf。这些函数复用字符串模块的安全格式化器,拒绝 %n,并以显式长度提交结果。已经得到消息视图时应继续使用无分配的 xrtLog,避免不必要的格式化和临时内存。

文本格式

xrtLogTextConfigInit 提供完整、简单和纯消息三种预设。xrtLogTextWrite 直接向同步字节 Writer 分段输出,不构造中间整行;默认把消息控制字符转义为单行文本,XLOG_TEXT_RAW_MESSAGE 可显式保留原始字节。

完整格式可包含固定 UTC 偏移时间、级别、Logger、源码、线程和全部结构化字段。字符串字段始终加引号并转义,错误字段保留 kind、domain、code 和 message。

启用独立的 logger_format_text_buffer 后,xrtLogText 返回由 xrtFree 释放的完整文本。控制台和文件 Sink 使用流式格式入口,不依赖该分配型 Helper;文件 Sink 会把分段结果写进自身有界复用缓冲,以便精确滚动并合并文件系统调用。

ThreadId 是可选元数据。轻量核心不会依赖完整线程模块自动读取线程标识;需要该字段时由调用方或线程集成 Helper 填入。

JSON Lines 格式

logger_format_json 提供 xrtLogJsonConfigInit 和 xrtLogJsonWrite。基础入口直接向同步 Writer 分段写入,不创建 xvalue、JSON DOM、完整 JSON Writer 或中间整行缓冲;它只依赖共享 JSON 转义、整数和浮点格式化底座。

默认输出顺序稳定:time、level、logger、message、source、thread、fields。时间使用 公元 UTC 毫秒整数,避免格式化损耗和精度丢失;不存在的源码和线程元数据不会写出。默认以换行结束,可直接组成 JSON Lines 文件或流。

FieldStyle 有两种契约:

  • XLOG_JSON_FIELDS_OBJECT:默认形式,字段名称直接作为对象成员,便于常规查询;重名字段按输入顺序写出,但下游对重复 JSON 名称的解释可能不同。
  • XLOG_JSON_FIELDS_ARRAY:每项固定包含 name、type 和 value,无损保留重名字段以及 int、uint、float、time 等类型差异。

非有限浮点默认由 XLOG_JSON_NONFINITE_REJECT 拒绝,调用方也可显式选择 NULL 或 STRING。字符串始终严格校验 UTF-8,EscapeFlags 复用 XJSON_WRITE_ESCAPE_SLASH、XJSON_WRITE_ESCAPE_HTML 和 XJSON_WRITE_ESCAPE_NON_ASCII。

错误字段保留 kind、domain、code、message,并在存在时写出 system_code、operation、data 和递归 cause。MaxErrorDepth 默认是 XLOG_JSON_ERROR_DEPTH_DEFAULT;超限或循环原因链在任何字节写出前失败,不会静默截断。

流式 Writer 失败时,已经成功提交的字节不能回滚,pWritten 返回精确数量。Writer 应设置具体错误;未设置时格式器建立 xrt.log / XLOG_ERROR_JSON_OUTPUT。UTF-8 错误使用 xrt.json 域并携带字节位置。

启用独立的 logger_format_json_buffer 后,xrtLogJson 返回由 xrtFree 释放的零结尾文本。文件、控制台和网络 Sink 应优先使用流式入口。

Console Sink

xrtLogConsoleConfigInit 建立适合交互程序的默认配置:最低 INFO、完整文本、ERROR 起写入 stderr、其余写入 stdout、逐条刷新并自动检测颜色。xrtLogConsole(NULL) 直接创建默认 Sink;xrtLogAddConsole(pLogger, NULL) 是创建并附加的一行常用路径。

Target 可选择 STDOUT、STDERR 或 SPLIT,分流阈值由 ErrorLevel 控制。Color 有三种明确语义:

  • AUTO:只对交互 TTY 启用;Windows 还会协商虚拟终端序列,并尊重 NO_COLOR 环境变量。
  • NEVER:不写 ANSI 序列,适合测试、文件重定向和由外部程序着色的输出。
  • ALWAYS:始终写级别颜色和复位序列,适合明确支持 ANSI 的管道。

Windows 下会从 CRT 标准流取得当前实际句柄,而不是缓存进程启动时的控制台句柄。真实控制台使用固定栈缓冲把严格 UTF-8 分块转换为 UTF-16,并通过 WriteConsoleW 写出;多字节标量可以跨内部块边界,转换过程不分配内存。管道、文件和测试重定向继续按原样写出 UTF-8 字节,不受控制台代码页影响。真实控制台遇到非法 UTF-8 时返回 XLOG_RESULT_ERROR 和 XLOG_ERROR_CONSOLE_WRITE。

Console Sink 完整复制配置且自身线程安全;同一 Sink 的多线程记录不会在文本格式器分段边界交错。它不关闭 stdout 或 stderr。错误处理器在 Console 写入失败后递归记录到同一 Sink 时,该嵌套记录返回 XLOG_RESULT_DROPPED,避免错误路径自锁;原始写入仍返回 XLOG_RESULT_ERROR 和保留 errno 的 xrt.log 错误。

Flush = true 保留旧版逐条刷新手感,适合交互和崩溃诊断;高吞吐命令行程序可以关闭它,并在阶段边界调用 xrtLogSinkFlush 或 xrtLogFlush。

File Sink

文件输出分为三个可独立裁剪的层:

  • logger_file:通用格式回调、文件句柄、动态记录缓冲、精确滚动、持久化、reopen 和统计;不依赖文本或 JSON 格式器。
  • logger_file_text:xrtLogTextFile、xrtLogAddTextFile,复制 xlogtextconfig 后复用文本流式格式器。
  • logger_file_json:xrtLogJsonFile、xrtLogAddJsonFile,复制 xlogjsonconfig 后复用 JSON 流式格式器。

常用文本文件只需要:

JSON Lines 路径可以直接使用 xrtLogAddJsonFile(pLogger, &File, NULL);空 JSON 配置采用完整默认格式。高级用户可向 xrtLogFile 提供 xlogformatproc,写入自定义文本、二进制封包或已有协议格式。格式器必须检查每次 Writer 返回值;即使第三方格式器错误地忽略失败,文件核心也会拒绝整条记录,不会写出已截断缓冲。xlogfileconfig.UserData 只在 xrtLogFile 成功后转移给 Sink,最后一个引用释放时调用 Drop;创建失败时仍归调用方。

Ring Sink

logger_ring 是日志不能反向阻塞业务线程时的高吞吐路径。创建时一次性分配固定记录槽、 空闲槽 MPMC 队列和就绪 MPSC 队列;预热完成后,生产者只做容量检查、完整记录复制和 无锁发布,不取得互斥锁,也不执行动态分配。单个工作线程按 Batch 批量消费,因此同一 Ring 内的已接受记录保持 FIFO。

Capacity 会规范为队列支持的 2 次幂容量,RecordLimit 是每槽可容纳的完整拥有型 记录上限。消息、Logger 名称、源码位置、字段名称、字符串字段和错误引用都在提交返回前 转为槽内拥有数据;工作线程不会读取调用方已经失效的视图。满载、超长记录和工作线程 递归写回当前 Ring 都立即返回 XLOG_RESULT_DROPPED,不会退化为分配或阻塞。

xrtLogSinkFlush(pFast) 使用创建时预分配的唯一栅栏,等待此前所有记录提交目标并调用 目标 Flush;并发 Flush 只在管理冷路径串行,不影响普通生产者。xrtLogRingStats 返回 接受、处理、各种丢弃、失败、当前队列、字节和高水位快照;xrtLogRingLastError 返回 后台最近错误的新引用。释放最后一个 Ring 引用会关闭生产入口、排空已接受记录、执行 最终目标 Flush 并等待工作线程退出。

Async Sink

logger_async 不复制 Console、File 或格式化逻辑,而是把任意同步 xlogsink 包装成有界异步 Sink。每个包装器只有一个工作线程,因此同一包装器内已经完成入队的记录、Flush 栅栏和目标调用保持 FIFO;需要并行处理不同目标时,应创建多个包装器,而不是让一个日志流在多个工作线程间失序。

xrtLogAsync 只增加目标引用,不接管调用方已有引用;返回的新包装器由调用方拥有。xrtLogAddAsync 是创建并附加的一行 Helper,成功后 Logger 持有包装器。空 Name 继承目标名称,包装层默认阈值为 TRACE,目标 Sink 仍会执行自己的阈值过滤。

并发

Logger、Sink、阈值、统计、附加、移除、提交和 Flush 都可并发调用。Sink 回调不在 Logger 锁内执行,因此允许递归记录,也允许回调移除自身。

移除只阻止新的快照取得 Sink。已经开始的提交可以完成当前回调,最后一个引用释放后才调用 Drop。

默认 Logger

xrtLogSetDefault 保存引用,xrtLogDefault 返回新引用。核心不会自动创建默认 Logger,也不会为默认 Logger 隐式附加 Sink。

xloglevel类型

日志级别从最详细到最严重排列,OFF 只用于过滤阈值。

值语义
XLOG_TRACE最详细级别
XLOG_DEBUG调试级别
XLOG_INFO信息级别
XLOG_WARN警告级别
XLOG_ERROR失败
XLOG_FATAL致命级别
XLOG_OFF关闭过滤
typedef enum xloglevel { XLOG_TRACE = 0, XLOG_DEBUG, XLOG_INFO, XLOG_WARN, XLOG_ERROR, XLOG_FATAL, XLOG_OFF } xloglevel;

xlogresult类型

日志结果把正常过滤、成功写入、主动丢弃和真实错误分开表达。

值语义
XLOG_RESULT_ERROR失败
XLOG_RESULT_SKIPPEDSKIPPED
XLOG_RESULT_WRITTENWRITTEN
XLOG_RESULT_DROPPED未写入但至少一个 Sink 主动丢弃
typedef enum xlogresult { XLOG_RESULT_ERROR = -1, XLOG_RESULT_SKIPPED = 0, XLOG_RESULT_WRITTEN = 1, XLOG_RESULT_DROPPED = 2 } xlogresult;

xlogerror类型

xrt.log 域错误码在各个日志分层之间保持稳定。

值语义
XLOG_ERROR_CALLBACK回调失败
XLOG_ERROR_TEXT_OUTPUT文本输出失败
XLOG_ERROR_JSON_OUTPUTJSON输出失败
XLOG_ERROR_JSON_CONFIGJSON配置非法
XLOG_ERROR_JSON_VALUEJSON值非法
XLOG_ERROR_JSON_DEPTH深度超限
XLOG_ERROR_CONSOLE_CONFIGCONSOLE配置非法
XLOG_ERROR_CONSOLE_WRITECONSOLE写方向
XLOG_ERROR_CONSOLE_FLUSHCONSOLE刷新
XLOG_ERROR_FILE_CONFIGFILE配置非法
XLOG_ERROR_FILE_OPEN失败
XLOG_ERROR_FILE_FORMAT格式非法
XLOG_ERROR_FILE_LIMITFILE超限
XLOG_ERROR_FILE_WRITEFILE写方向
XLOG_ERROR_FILE_SYNC失败
XLOG_ERROR_FILE_ROTATE失败
XLOG_ERROR_FILE_CLOSE失败
XLOG_ERROR_ASYNC_CONFIGASYNC配置非法
XLOG_ERROR_ASYNC_RECORD失败
XLOG_ERROR_ASYNC_QUEUE失败
XLOG_ERROR_ASYNC_CLOSEDASYNC已关闭
XLOG_ERROR_ASYNC_TARGET失败
XLOG_ERROR_ASYNC_FLUSHASYNC刷新
XLOG_ERROR_ASYNC_THREADASYNC线程标识
XLOG_ERROR_RING_CONFIGRING配置非法
XLOG_ERROR_RING_QUEUE失败
XLOG_ERROR_RING_CLOSEDRING已关闭
XLOG_ERROR_RING_TARGET失败
XLOG_ERROR_RING_FLUSHRING刷新
XLOG_ERROR_RING_THREADRing 线程失败
typedef enum xlogerror { XLOG_ERROR_CALLBACK = 1, XLOG_ERROR_TEXT_OUTPUT, XLOG_ERROR_JSON_OUTPUT, XLOG_ERROR_JSON_CONFIG, XLOG_ERROR_JSON_VALUE, XLOG_ERROR_JSON_DEPTH, XLOG_ERROR_CONSOLE_CONFIG, XLOG_ERROR_CONSOLE_WRITE, XLOG_ERROR_CONSOLE_FLUSH, XLOG_ERROR_FILE_CONFIG, XLOG_ERROR_FILE_OPEN, XLOG_ERROR_FILE_FORMAT, XLOG_ERROR_FILE_LIMIT, XLOG_ERROR_FILE_WRITE, XLOG_ERROR_FILE_SYNC, XLOG_ERROR_FILE_ROTATE, XLOG_ERROR_FILE_CLOSE, XLOG_ERROR_ASYNC_CONFIG, XLOG_ERROR_ASYNC_RECORD, XLOG_ERROR_ASYNC_QUEUE, XLOG_ERROR_ASYNC_CLOSED, XLOG_ERROR_ASYNC_TARGET, XLOG_ERROR_ASYNC_FLUSH, XLOG_ERROR_ASYNC_THREAD, XLOG_ERROR_RING_CONFIG, XLOG_ERROR_RING_QUEUE, XLOG_ERROR_RING_CLOSED, XLOG_ERROR_RING_TARGET, XLOG_ERROR_RING_FLUSH, XLOG_ERROR_RING_THREAD } xlogerror;

xlogfieldtype类型

结构化字段类型不依赖 Value 容器,保持 Logger 核心轻量。

值语义
XLOG_FIELD_NULL空值
XLOG_FIELD_BOOL布尔
XLOG_FIELD_INT有符号整数
XLOG_FIELD_UINT无符号整数
XLOG_FIELD_FLOAT浮点
XLOG_FIELD_STRING字符串
XLOG_FIELD_TIME时间
XLOG_FIELD_ERROR失败
typedef enum xlogfieldtype { XLOG_FIELD_NULL = 0, XLOG_FIELD_BOOL, XLOG_FIELD_INT, XLOG_FIELD_UINT, XLOG_FIELD_FLOAT, XLOG_FIELD_STRING, XLOG_FIELD_TIME, XLOG_FIELD_ERROR } xlogfieldtype;

xlogrecord类型

一条记录的所有视图和字段只在提交调用期间有效。

字段类型语义
Timextime时间戳(公元 UTC 毫秒)
Levelxloglevel级别
LoggerxstrviewLogger
Messagexstrview消息文本
Fieldsconst xlogfield*Fields
FieldCountsize_tFieldCount
Filexstrview文件名
Functionxstrview函数名
Lineuint32行号
ThreadIduint64线程标识
typedef struct xlogrecord { xtime Time; xloglevel Level; xstrview Logger; xstrview Message; const xlogfield* Fields; size_t FieldCount; xstrview File; xstrview Function; uint32 Line; uint64 ThreadId; } xlogrecord;

xlogstats类型

统计按记录聚合;一个记录写到多个 Sink 仍只计一次 Logger 结果。

字段类型语义
Submitteduint64Submitted
Writtenuint64Written
Skippeduint64Skipped
Droppeduint64Dropped
Faileduint64Failed
typedef struct xlogstats { uint64 Submitted; uint64 Written; uint64 Skipped; uint64 Dropped; uint64 Failed; } xlogstats;

xlogsinkconfig类型

自定义 Sink 配置在创建成功后把 UserData 生命周期交给 Sink。

字段类型语义
Namexstrview名称
Levelxloglevel级别
WritexlogsinkwriteprocWrite
FlushxlogsinkflushprocFlush
DropxlogsinkdropprocDrop
UserDataptr用户数据
typedef struct xlogsinkconfig { xstrview Name; xloglevel Level; xlogsinkwriteproc Write; xlogsinkflushproc Flush; xlogsinkdropproc Drop; ptr UserData; } xlogsinkconfig;

xlogtextstyle类型

三种预设只初始化配置,调用方仍可逐位调整输出组成。

值语义
XLOG_TEXT_FULL已满
XLOG_TEXT_SIMPLE简单格式
XLOG_TEXT_MESSAGE仅输出消息本身
typedef enum xlogtextstyle { XLOG_TEXT_FULL = 0, XLOG_TEXT_SIMPLE, XLOG_TEXT_MESSAGE } xlogtextstyle;

xlogtextflag类型

文本标志分别控制前缀、元数据、字段、换行和消息原样输出。

值语义
XLOG_TEXT_TIME时间
XLOG_TEXT_LEVEL级别
XLOG_TEXT_LOGGERLogger 名称
XLOG_TEXT_SOURCE源码位置
XLOG_TEXT_THREAD线程标识
XLOG_TEXT_FIELDS字段
XLOG_TEXT_NEWLINE换行
XLOG_TEXT_RAW_MESSAGE消息控制字符原样输出
typedef enum xlogtextflag { XLOG_TEXT_TIME = UINT32_C(0x00000001), XLOG_TEXT_LEVEL = UINT32_C(0x00000002), XLOG_TEXT_LOGGER = UINT32_C(0x00000004), XLOG_TEXT_SOURCE = UINT32_C(0x00000008), XLOG_TEXT_THREAD = UINT32_C(0x00000010), XLOG_TEXT_FIELDS = UINT32_C(0x00000020), XLOG_TEXT_NEWLINE = UINT32_C(0x00000040), XLOG_TEXT_RAW_MESSAGE = UINT32_C(0x00000080)

xlogtextconfig类型

文本配置使用固定 UTC 偏移,默认完整格式为 UTC 单行文本。

字段类型语义
Flagsuint32标志位
UtcOffsetintUTC 偏移(分钟)
typedef struct xlogtextconfig { uint32 Flags; int UtcOffset; } xlogtextconfig;

xlogjsonfieldstyle类型

JSON 字段默认写成对象,数组形式可无损保留重名和字段类型。

值语义
XLOG_JSON_FIELDS_OBJECTXLOGJSON字段对象形态
XLOG_JSON_FIELDS_ARRAY数组形式字段
typedef enum xlogjsonfieldstyle { XLOG_JSON_FIELDS_OBJECT = 0, XLOG_JSON_FIELDS_ARRAY } xlogjsonfieldstyle;

xlogjsonnonfinite类型

非有限浮点值必须由调用方明确选择拒绝、null 或字符串表示。

值语义
XLOG_JSON_NONFINITE_REJECTREJECT
XLOG_JSON_NONFINITE_NULL空值
XLOG_JSON_NONFINITE_STRING字符串表示
typedef enum xlogjsonnonfinite { XLOG_JSON_NONFINITE_REJECT = 0, XLOG_JSON_NONFINITE_NULL, XLOG_JSON_NONFINITE_STRING } xlogjsonnonfinite;

xlogjsonflag类型

JSON 标志分别控制顶层元数据、字段和 JSON Lines 换行。

值语义
XLOG_JSON_TIME时间
XLOG_JSON_LEVEL级别
XLOG_JSON_LOGGERLogger 名称
XLOG_JSON_MESSAGE消息
XLOG_JSON_SOURCE源码位置
XLOG_JSON_THREAD线程标识
XLOG_JSON_FIELDS字段
XLOG_JSON_NEWLINE换行结束
typedef enum xlogjsonflag { XLOG_JSON_TIME = UINT32_C(0x00000001), XLOG_JSON_LEVEL = UINT32_C(0x00000002), XLOG_JSON_LOGGER = UINT32_C(0x00000004), XLOG_JSON_MESSAGE = UINT32_C(0x00000008), XLOG_JSON_SOURCE = UINT32_C(0x00000010), XLOG_JSON_THREAD = UINT32_C(0x00000020), XLOG_JSON_FIELDS = UINT32_C(0x00000040), XLOG_JSON_NEWLINE = UINT32_C(0x00000080)

xlogjsonconfig类型

JSON 配置独立约束转义、字段表示、非有限数和错误原因链。

字段类型语义
Flagsuint32标志位
EscapeFlagsuint32EscapeFlags
FieldStylexlogjsonfieldstyleFieldStyle
NonFinitexlogjsonnonfiniteNonFinite
MaxErrorDepthsize_tMaxErrorDepth
typedef struct xlogjsonconfig { uint32 Flags; uint32 EscapeFlags; xlogjsonfieldstyle FieldStyle; xlogjsonnonfinite NonFinite; size_t MaxErrorDepth; } xlogjsonconfig;

xlogconsoletarget类型

控制台目标可固定到一个流,或按级别分流。

值语义
XLOG_CONSOLE_STDOUT标准输出
XLOG_CONSOLE_STDERR标准错误
XLOG_CONSOLE_SPLIT按级别分流
typedef enum xlogconsoletarget { XLOG_CONSOLE_STDOUT = 0, XLOG_CONSOLE_STDERR, XLOG_CONSOLE_SPLIT } xlogconsoletarget;

xlogconsolecolor类型

自动配色只对支持 ANSI 的交互终端生效,并尊重 NO_COLOR。

值语义
XLOG_CONSOLE_COLOR_AUTO自动
XLOG_CONSOLE_COLOR_NEVER永不
XLOG_CONSOLE_COLOR_ALWAYS始终着色
typedef enum xlogconsolecolor { XLOG_CONSOLE_COLOR_AUTO = 0, XLOG_CONSOLE_COLOR_NEVER, XLOG_CONSOLE_COLOR_ALWAYS } xlogconsolecolor;

xlogconsoleconfig类型

Console Sink 配置在创建时完整复制,后续修改不影响已创建对象。

字段类型语义
Levelxloglevel级别
Targetxlogconsoletarget目标视图
ColorxlogconsolecolorColor
ErrorLevelxloglevelErrorLevel
FlushboolFlush
Textxlogtextconfig文本视图
typedef struct xlogconsoleconfig { xloglevel Level; xlogconsoletarget Target; xlogconsolecolor Color; xloglevel ErrorLevel; bool Flush; xlogtextconfig Text; } xlogconsoleconfig;

xlogfilemode类型

启动模式只影响首次打开;reopen 和滚动后的文件始终按追加语义打开。

值语义
XLOG_FILE_APPENDXLOGFILE追加
XLOG_FILE_TRUNCATE创建时截断
typedef enum xlogfilemode { XLOG_FILE_APPEND = 0, XLOG_FILE_TRUNCATE } xlogfilemode;

xlogfilesync类型

文件持久化可以完全手动、逐条执行,或在写入时按单调时钟间隔执行。

值语义
XLOG_FILE_SYNC_MANUAL手动
XLOG_FILE_SYNC_RECORDRECORD
XLOG_FILE_SYNC_INTERVAL按间隔落盘
typedef enum xlogfilesync { XLOG_FILE_SYNC_MANUAL = 0, XLOG_FILE_SYNC_RECORD, XLOG_FILE_SYNC_INTERVAL } xlogfilesync;

xlogfileoptions类型

文件选项在创建时完整复制,Path 文本也会被独立复制。

字段类型语义
Pathcstr路径
Levelxloglevel级别
Modexlogfilemode模式
SyncxlogfilesyncSync
MaxBytesuint64滚动字节阈值
BackupCountuint32保留备份数
RecordLimitsize_t单条上限
BufferLimitsize_t缓冲保留上限
SyncIntervaluint64同步间隔
typedef struct xlogfileoptions { cstr Path; xloglevel Level; xlogfilemode Mode; xlogfilesync Sync; uint64 MaxBytes; uint32 BackupCount; size_t RecordLimit; size_t BufferLimit; uint64 SyncInterval; } xlogfileoptions;

xlogfileconfig类型

通用文件配置在创建成功后把格式器数据生命周期交给 Sink。

字段类型语义
Optionsxlogfileoptions选项
Formatxlogformatproc格式
DropxlogformatdropprocDrop
UserDataptr用户数据
typedef struct xlogfileconfig { xlogfileoptions Options; xlogformatproc Format; xlogformatdropproc Drop; ptr UserData; } xlogfileconfig;

xlogfilestats类型

文件统计区分当前文件大小和进程内累计写入量。

字段类型语义
CurrentBytesuint64CurrentBytes
WrittenBytesuint64WrittenBytes
Recordsuint64Records
Rotationsuint64Rotations
Reopensuint64Reopens
Syncsuint64Syncs
typedef struct xlogfilestats { uint64 CurrentBytes; uint64 WrittenBytes; uint64 Records; uint64 Rotations; uint64 Reopens; uint64 Syncs; } xlogfilestats;

xlogasyncfull类型

队列满载策略明确区分业务背压、新记录丢弃和旧记录覆盖。

值语义
XLOG_ASYNC_BLOCK阻塞策略
XLOG_ASYNC_DROP_NEWEST丢弃策略NEWEST
XLOG_ASYNC_DROP_OLDEST覆盖最旧记录
typedef enum xlogasyncfull { XLOG_ASYNC_BLOCK = 0, XLOG_ASYNC_DROP_NEWEST, XLOG_ASYNC_DROP_OLDEST } xlogasyncfull;

xlogasyncshutdown类型

最后一个 Async Sink 引用释放时可以排空队列,也可以显式放弃未处理记录。

值语义
XLOG_ASYNC_DRAINXLOGASYNC排空策略
XLOG_ASYNC_DISCARD放弃未处理记录
typedef enum xlogasyncshutdown { XLOG_ASYNC_DRAIN = 0, XLOG_ASYNC_DISCARD } xlogasyncshutdown;

xlogasyncconfig类型

Async Sink 保持单工作线程顺序,并同时限制排队记录数和真实记录字节数。

字段类型语义
Namexstrview名称
Levelxloglevel级别
FullxlogasyncfullFull
ShutdownxlogasyncshutdownShutdown
Capacitysize_t容量
RecordLimitsize_t单条上限
ByteLimitsize_tByteLimit
StackSizesize_t栈大小
typedef struct xlogasyncconfig { xstrview Name; xloglevel Level; xlogasyncfull Full; xlogasyncshutdown Shutdown; size_t Capacity; size_t RecordLimit; size_t ByteLimit; size_t StackSize; } xlogasyncconfig;

xlogasyncstats类型

异步统计区分入队、目标结果、各类丢弃和当前队列高水位。

字段类型语义
Enqueueduint64Enqueued
Processeduint64Processed
Writtenuint64Written
Skippeduint64Skipped
DroppedNewestuint64DroppedNewest
DroppedOldestuint64DroppedOldest
DroppedTargetuint64DroppedTarget
ReentrantDropsuint64ReentrantDrops
Discardeduint64Discarded
Faileduint64Failed
Flushesuint64Flushes
Queuedsize_tQueued
QueueBytessize_tQueueBytes
PeakQueuedsize_tPeakQueued
PeakBytessize_tPeakBytes
typedef struct xlogasyncstats { uint64 Enqueued; uint64 Processed; uint64 Written; uint64 Skipped; uint64 DroppedNewest; uint64 DroppedOldest; uint64 DroppedTarget; uint64 ReentrantDrops; uint64 Discarded; uint64 Failed; uint64 Flushes; size_t Queued; size_t QueueBytes; size_t PeakQueued; size_t PeakBytes; } xlogasyncstats;

xlogringconfig类型

Ring 预分配固定记录槽;满载和超长记录均立即丢弃,不反向阻塞业务线程。

字段类型语义
Namexstrview名称
Levelxloglevel级别
Capacitysize_t容量
RecordLimitsize_t单条上限
Batchsize_t批量大小
StackSizesize_t栈大小
IdleWaituint64IdleWait
typedef struct xlogringconfig { xstrview Name; xloglevel Level; size_t Capacity; size_t RecordLimit; size_t Batch; size_t StackSize; uint64 IdleWait; } xlogringconfig;

xlogringstats类型

Ring 统计区分容量丢弃、记录超限、递归写入和目标 Sink 结果。

字段类型语义
Enqueueduint64Enqueued
Processeduint64Processed
Writtenuint64Written
Skippeduint64Skipped
TargetDroppeduint64TargetDropped
Droppeduint64Dropped
Oversizeduint64Oversized
ReentrantDropsuint64ReentrantDrops
Faileduint64Failed
Flushesuint64Flushes
Queuedsize_tQueued
QueueBytessize_tQueueBytes
PeakQueuedsize_tPeakQueued
PeakBytessize_tPeakBytes
typedef struct xlogringstats { uint64 Enqueued; uint64 Processed; uint64 Written; uint64 Skipped; uint64 TargetDropped; uint64 Dropped; uint64 Oversized; uint64 ReentrantDrops; uint64 Failed; uint64 Flushes; size_t Queued; size_t QueueBytes; size_t PeakQueued; size_t PeakBytes; } xlogringstats;

xlogger类型

Logger 和 Sink 都是线程安全的引用对象。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xlogger xlogger;

xlogsink类型

Sink 对象(不透明):线程安全的引用对象,可被多个 Logger 和包装 Sink 共享。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xlogsink xlogsink;

xlogwriteproc类型

通用字节 Writer 必须在返回前消费借用数据。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xlogwriteproc)(xbytesview Data, ptr pUserData)

xlogformatproc类型

通用格式器同步地把一条借用记录写给 Writer。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xlogformatproc)( const xlogrecord* pRecord, xlogwriteproc pWrite, ptr pWriteData, ptr pUserData)

xlogformatdropproc类型

格式器数据释放回调只在成功创建的拥有者销毁时执行。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xlogformatdropproc)(ptr pUserData)

xlogsinkwriteproc类型

Sink 回调同步消费借用记录,并返回稳定的流控结果。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xlogresult(*xlogsinkwriteproc)( const xlogrecord* pRecord, ptr pUserData)

xlogsinkflushproc类型

Flush 回调提交已经接受的内容;空回调等价于成功。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xlogsinkflushproc)(ptr pUserData)

xlogsinkdropproc类型

Drop 回调在最后一个 Sink 引用释放后接收用户数据。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef void(*xlogsinkdropproc)(ptr pUserData)
级别、记录与字段

xrtLogLevelName函数

返回日志级别的稳定英文名称,供格式化和诊断输出使用。

cstr xrtLogLevelName(xloglevel Level)

参数

参数方向约束说明
Level输入—待命名的日志级别
返回值
返回含义失败时状态
非空静态英文名称("TRACE" … "OFF")—
""级别非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 级别不在 XLOG_TRACE … XLOG_OFF 枚举范围内

范例已编译验证

core · 级别名称

		xrtLogLevelName(pRecord->Level),

xrtLogRecordValidate函数

校验记录的级别、全部视图、字段范围和字段类型;所有提交入口内部先执行同一校验。

bool xrtLogRecordValidate(const xlogrecord* pRecord)

参数

参数方向约束说明
pRecord输入非空待校验的记录
返回值
返回含义失败时状态
true记录合法,可提交—
false非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 提交前校验

			xrtLogRecordValidate(&(xlogrecord){ 0 }) ? 1 : 0);

xrtLogFieldNull函数

构造显式 NULL 语义的字段;字段借用名称,不拥有任何数据。

xlogfield xrtLogFieldNull(xstrview Name)

参数

参数方向约束说明
Name输入借用字段名视图
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

sink_tour · 空值字段

		Fields[i++] = xrtLogFieldNull(SV("n"));

xrtLogFieldBool函数

构造布尔字段。

xlogfield xrtLogFieldBool(xstrview Name, bool bValue)

参数

参数方向约束说明
Name输入借用字段名视图
bValue输入—布尔值
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

json · 布尔字段

	Fields[1] = xrtLogFieldBool(XRT_STR_LITERAL("cached"), false);

xrtLogFieldInt函数

构造 int64 字段。

xlogfield xrtLogFieldInt(xstrview Name, int64 iValue)

参数

参数方向约束说明
Name输入借用字段名视图
iValue输入—整数值
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

core · 整数字段

	Field = xrtLogFieldInt(XRT_STR_LITERAL("request_id"), 42);

xrtLogFieldUInt函数

构造 uint64 字段。

xlogfield xrtLogFieldUInt(xstrview Name, uint64 iValue)

参数

参数方向约束说明
Name输入借用字段名视图
iValue输入—无符号值
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

file_json · 无符号字段

	Field = xrtLogFieldUInt(XRT_STR_LITERAL("request_id"), 42u);

xrtLogFieldFloat函数

构造 double 字段。

xlogfield xrtLogFieldFloat(xstrview Name, double fValue)

参数

参数方向约束说明
Name输入借用字段名视图
fValue输入—浮点值
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

sink_tour · 浮点字段

		Fields[i++] = xrtLogFieldFloat(SV("f"), 1.5);

xrtLogFieldString函数

构造字符串字段;值视图与字段名一样只在提交调用期间有效。

xlogfield xrtLogFieldString(xstrview Name, xstrview Value)

参数

参数方向约束说明
Name输入借用字段名视图
Value输入借用字符串值视图
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

sink_tour · 字符串字段

		Fields[i++] = xrtLogFieldString(SV("s"), SV("val"));

xrtLogFieldTime函数

构造 公元 UTC 毫秒时间字段。

xlogfield xrtLogFieldTime(xstrview Name, xtime iValue)

参数

参数方向约束说明
Name输入借用字段名视图
iValue输入—公元 UTC 毫秒
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

sink_tour · 时间字段

		Fields[i++] = xrtLogFieldTime(SV("t"), xrtNow());

xrtLogFieldError函数

构造借用结构化错误的字段;异步层复制时会增加错误引用。

xlogfield xrtLogFieldError(xstrview Name, const xerror* pError)

参数

参数方向约束说明
Name输入借用字段名视图
pError输入借用不可变错误对象
返回值
返回含义失败时状态
字段值按值返回的借用字段—
错误
  • 无 — 本函数不设置错误

范例已编译验证

sink_tour · 错误字段

		Fields[i++] = xrtLogFieldError(SV("e"), NULL);
Logger 生命周期

xrtLogCreate函数

创建同步 Logger;名称被复制到对象内部,初始没有 Sink。

xlogger* xrtLogCreate(xstrview Name, xloglevel Level)

参数

参数方向约束说明
Name输入非空视图Logger 名称
Level输入合法级别初始过滤阈值
返回值
返回含义失败时状态
非空Logger(引用 1)—
NULL创建失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 名称长度引起尺寸溢出
  • XERR_MEMORY — 分配失败

范例已编译验证

core · 创建与最小用法

	pLogger = xrtLogCreate(XRT_STR_LITERAL("example"), XLOG_DEBUG);

xrtLogRef函数

增加 Logger 引用并返回原指针。

xlogger* xrtLogRef(xlogger* pLogger)

参数

参数方向约束说明
pLogger输入非空目标 Logger
返回值
返回含义失败时状态
非空原指针,引用 +1—
NULL参数非法或引用已失效XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 引用计数已失效

范例已编译验证

logger_tour · 共享引用

		xlogger* pRef = xrtLogRef(pLogger);

xrtLogFree函数

释放 Logger 引用;空指针不执行操作,归零时释放最终 Sink 快照。

void xrtLogFree(xlogger* pLogger)

参数

参数方向约束说明
pLogger输入允许空空 = 空操作
返回值
返回含义失败时状态
无引用 -1—
错误
  • 无 — 释放不失败

范例已编译验证

core · 释放

		xrtLogFree(pLogger);

xrtLogName函数

返回 Logger 生命周期内稳定的借用名称。

xstrview xrtLogName(const xlogger* pLogger)

参数

参数方向约束说明
pLogger输入非空目标 Logger
返回值
返回含义失败时状态
非空视图借用名称—
空视图参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

logger_tour · 名称查询

			(int)xrtLogName(pDefault).Size, xrtLogName(pDefault).Data);

xrtLogLevel函数

并发读取 Logger 当前过滤阈值。

xloglevel xrtLogLevel(const xlogger* pLogger)

参数

参数方向约束说明
pLogger输入非空目标 Logger
返回值
返回含义失败时状态
XLOG_TRACE最详细级别—
XLOG_DEBUG调试级别—
XLOG_INFO信息级别—
XLOG_WARN警告级别—
XLOG_ERROR错误级别—
XLOG_FATAL致命级别—
XLOG_OFF关闭过滤—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

logger_tour · 阈值读取

		printf(" level=%d", (int)xrtLogLevel(pDefault));

xrtLogSetLevel函数

原子调整 Logger 过滤阈值,立即对后续提交生效。

bool xrtLogSetLevel(xlogger* pLogger, xloglevel Level)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别新阈值
返回值
返回含义失败时状态
true已更新—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

logger_tour · 阈值调整

	printf("set-level=%d", xrtLogSetLevel(pLogger, XLOG_WARN) ? 1 : 0);

xrtLogDefault函数

返回进程默认 Logger 的新引用;核心不会自动创建默认 Logger。

xlogger* xrtLogDefault()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
非空默认 Logger 新引用,用后 xrtLogFree—
NULL尚未设置默认不设错
错误
  • 无错误 — 未设置默认 Logger 时返回 NULL 且不设置错误

范例已编译验证

logger_tour · 进程默认 Logger

		xlogger* pDefault = xrtLogDefault();

xrtLogSetDefault函数

原子替换进程默认 Logger;保存新引用并释放旧引用,空指针用于清除。

bool xrtLogSetDefault(xlogger* pLogger)

参数

参数方向约束说明
pLogger输入允许空新默认;空 = 清除
返回值
返回含义失败时状态
true已替换或已清除—
false引用失败XERR_STATE
错误
  • XERR_STATE — 对目标 Logger 增加引用失败;空指针清除不失败

范例已编译验证

logger_tour · 替换默认 Logger

		xrtLogSetDefault(pLogger) ? "ok" : "fail");
Sink 生命周期与直连

xrtLogSinkCreate函数

创建可被多个 Logger 和包装 Sink 共享的自定义 Sink;成功后 UserData 生命周期交给 Sink。

xlogsink* xrtLogSinkCreate(const xlogsinkconfig* pConfig)

参数

参数方向约束说明
pConfig输入非空且 Write 非空操作表与上下文
返回值
返回含义失败时状态
非空Sink(引用 1)—
NULL创建失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 内部结构分配失败

范例已编译验证

async · 自定义 Sink

	pTarget = xrtLogSinkCreate(&TargetConfig);

xrtLogSinkRef函数

增加 Sink 引用并返回原指针。

xlogsink* xrtLogSinkRef(xlogsink* pSink)

参数

参数方向约束说明
pSink输入非空目标 Sink
返回值
返回含义失败时状态
非空原指针,引用 +1—
NULL参数非法或引用已失效XERR_ARGUMENT / XERR_STATE
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_STATE — 引用计数已失效

范例已编译验证

sink_tour · 共享引用

	(void)xrtLogSinkRef(pConsole);

xrtLogSinkFree函数

释放 Sink 引用;空指针不执行操作,归零时调用 Drop 回调。

void xrtLogSinkFree(xlogsink* pSink)

参数

参数方向约束说明
pSink输入允许空空 = 空操作
返回值
返回含义失败时状态
无引用 -1—
错误
  • 无 — 释放不失败

范例已编译验证

async · 释放

		xrtLogSinkFree(pTarget);

xrtLogSinkName函数

返回 Sink 生命周期内稳定的借用名称。

xstrview xrtLogSinkName(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入非空目标 Sink
返回值
返回含义失败时状态
非空视图借用名称—
空视图参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 名称查询

		(int)xrtLogSinkName(pConsole).Size, xrtLogSinkName(pConsole).Data);

xrtLogSinkLevel函数

并发读取 Sink 当前过滤阈值。

xloglevel xrtLogSinkLevel(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入非空目标 Sink
返回值
返回含义失败时状态
XLOG_TRACE最详细级别—
XLOG_DEBUG调试级别—
XLOG_INFO信息级别—
XLOG_WARN警告级别—
XLOG_ERROR错误级别—
XLOG_FATAL致命级别—
XLOG_OFF关闭过滤—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 阈值读取

	printf(" level=%d", (int)xrtLogSinkLevel(pConsole));

xrtLogSinkSetLevel函数

原子调整 Sink 过滤阈值。

bool xrtLogSinkSetLevel(xlogsink* pSink, xloglevel Level)

参数

参数方向约束说明
pSink输入非空目标 Sink
Level输入合法级别新阈值
返回值
返回含义失败时状态
true已更新—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 阈值调整

	(void)xrtLogSinkSetLevel(pConsole, XLOG_WARN);

xrtLogSinkSubmit函数

绕过 Logger 直接向一个 Sink 提交完整记录,供包装器和高级用户组合处理链。

xlogresult xrtLogSinkSubmit(xlogsink* pSink, const xlogrecord* pRecord)

参数

参数方向约束说明
pSink输入非空目标 Sink
pRecord输入非空且通过校验完整记录
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN本 Sink 完成写入—
XLOG_RESULT_SKIPPED被本 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED本 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或本 Sink 回调真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空或记录未通过 xrtLogRecordValidate
  • xrt.log / XLOG_ERROR_CALLBACK — Sink 回调返回错误但未设置具体错误
  • XERR_INTERNAL — Sink 回调返回越界的结果值

范例已编译验证

async · 直连提交

	if ( xrtLogSinkSubmit(pAsync, &Record) != XLOG_RESULT_WRITTEN ) {

xrtLogSinkFlush函数

提交 Sink 已经接受的内容;文件 Sink 落盘、异步 Sink 插入栅栏等待。

bool xrtLogSinkFlush(xlogsink* pSink)

参数

参数方向约束说明
pSink输入非空目标 Sink
返回值
返回含义失败时状态
true已提交—
false参数非法或 Flush 失败XERR_ARGUMENT / xrt.log 错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log 域错误 — Flush 回调失败(如 XLOG_ERROR_ASYNC_FLUSH、文件同步错误)

范例已编译验证

async · 冲刷

	if ( !xrtLogSinkFlush(pAsync) ) {

xrtLogSinkStats函数

并发读取 Sink 的聚合统计快照。

bool xrtLogSinkStats(const xlogsink* pSink, xlogstats* pStats)

参数

参数方向约束说明
pSink输入非空目标 Sink
pStats输出非空接收快照
返回值
返回含义失败时状态
true快照已写出—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 统计快照

	if ( xrtLogSinkStats(pConsole, &Stats) ) {
附加与移除

xrtLogAttach函数

把可共享 Sink 附加到 Logger;双方各增加引用,同一 Sink 可附加到多个 Logger。

bool xrtLogAttach(xlogger* pLogger, xlogsink* pSink)

参数

参数方向约束说明
pLogger输入/输出非空目标 Logger
pSink输入非空要附加的 Sink
返回值
返回含义失败时状态
true已附加—
false失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_EXISTS — 该 Sink 已经附加到本 Logger
  • XERR_STATE — Sink 引用失败
  • XERR_MEMORY — 快照扩容分配失败

范例已编译验证

core · 挂载 Sink

		!xrtLogAttach(pLogger, pSink)

xrtLogDetach函数

从 Logger 移除指定 Sink;未附加时返回失败且不设置错误。

bool xrtLogDetach(xlogger* pLogger, xlogsink* pSink)

参数

参数方向约束说明
pLogger输入/输出非空目标 Logger
pSink输入非空要移除的 Sink
返回值
返回含义失败时状态
true已移除并释放对应引用—
false未附加不设错
错误
  • 不设错误 — 未附加时返回 false 且不设置错误;句柄为空设置 XERR_ARGUMENT

范例已编译验证

sink_tour · 卸载

	printf("detach-single=%d", xrtLogDetach(pLogger, pConsole) ? 1 : 0);

xrtLogDetachAll函数

移除 Logger 的全部 Sink,并返回实际移除数量。

size_t xrtLogDetachAll(xlogger* pLogger)

参数

参数方向约束说明
pLogger输入/输出非空目标 Logger
返回值
返回含义失败时状态
>= 0实际移除数量—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 全部卸载

	printf(" detach-all=%zu\n", xrtLogDetachAll(pLogger));

xrtLogSinkCount函数

返回并发快照中的 Sink 数量。

size_t xrtLogSinkCount(xlogger* pLogger)

参数

参数方向约束说明
pLogger输入非空目标 Logger
返回值
返回含义失败时状态
>= 0当前附加数量—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 数量查询

	printf(" count=%zu", xrtLogSinkCount(pLogger));
提交与统计

xrtLogSubmit函数

提交完整记录;记录的 Logger 视图始终由目标 Logger 名称覆盖。

xlogresult xrtLogSubmit(xlogger* pLogger, const xlogrecord* pRecord)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pRecord输入非空且通过校验完整记录
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空或记录未通过 xrtLogRecordValidate
  • xrt.log / XLOG_ERROR_CALLBACK — Sink 回调返回错误但未设置具体错误
  • XERR_INTERNAL — Sink 回调返回越界的结果值

范例已编译验证

logger_tour · 完整记录提交

		xrtLogSubmit(xrtLogDefault(), &Record) == XLOG_RESULT_WRITTEN ? 1 : 0);

xrtLog函数

使用当前时间提交一条无字段文本记录。

xlogresult xrtLog(xlogger* pLogger, xloglevel Level, xstrview Message)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
Message输入借用消息视图
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空或记录未通过 xrtLogRecordValidate
  • xrt.log / XLOG_ERROR_CALLBACK — Sink 回调返回错误但未设置具体错误
  • XERR_INTERNAL — Sink 回调返回越界的结果值

范例已编译验证

console · 文本提交

	(void)xrtLog(pLogger, XLOG_INFO, XRT_STR_LITERAL("service started"));

xrtLogFields函数

使用当前时间提交带结构化字段的记录。

xlogresult xrtLogFields(xlogger* pLogger, xloglevel Level, xstrview Message, const xlogfield* pFields, size_t iFieldCount)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
Message输入借用消息视图
pFields输入借用数组;计数为 0 时可空字段数组
iFieldCount输入—字段数量
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空或记录未通过 xrtLogRecordValidate
  • xrt.log / XLOG_ERROR_CALLBACK — Sink 回调返回错误但未设置具体错误
  • XERR_INTERNAL — Sink 回调返回越界的结果值

范例已编译验证

core · 字段提交

		xrtLogFields(
			pLogger,
			XLOG_INFO,
			XRT_STR_LITERAL("request complete"),
			&Field,
			1u
		) != XLOG_RESULT_WRITTEN

xrtLogSource函数

使用当前时间提交带完整源码位置和结构化字段的记录。

xlogresult xrtLogSource(xlogger* pLogger, xloglevel Level, xstrview Message, const xlogfield* pFields, size_t iFieldCount, xstrview File, xstrview Function, uint32 iLine, uint64 iThreadId)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
Message输入借用消息视图
pFields输入借用数组;计数为 0 时可空字段数组
iFieldCount输入—字段数量
File输入借用;可空视图源文件名
Function输入借用;可空视图函数名
iLine输入—行号
iThreadId输入—线程标识,0 = 不记录
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空或记录未通过 xrtLogRecordValidate
  • xrt.log / XLOG_ERROR_CALLBACK — Sink 回调返回错误但未设置具体错误
  • XERR_INTERNAL — Sink 回调返回越界的结果值

范例已编译验证

sink_tour · 源码元数据提交

	(void)xrtLogSource(pLogger, XLOG_WARN, SV("direct source"), NULL, 0u,
		SV("demo.c"), SV("main"), 1u, 0u);

xrtLogFlush函数

提交 Logger 全部 Sink 已经接受的内容。

bool xrtLogFlush(xlogger* pLogger)

参数

参数方向约束说明
pLogger输入非空目标 Logger
返回值
返回含义失败时状态
true全部 Sink 冲刷成功—
false任一 Sink 失败XERR_ARGUMENT / xrt.log 错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log 域错误 — 任一 Sink 的 Flush 失败

范例已编译验证

console · 全部冲刷

	(void)xrtLogFlush(pLogger);

xrtLogStats函数

并发读取 Logger 的聚合统计快照;写到多个 Sink 的一条记录只计一次 Logger 结果。

bool xrtLogStats(const xlogger* pLogger, xlogstats* pStats)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pStats输出非空接收快照
返回值
返回含义失败时状态
true快照已写出—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 统计快照

		printf("log-stats=%d\n", xrtLogStats(pLogger, &LogStats) ? 1 : 0);
文本格式化

xrtLogTextConfigInit函数

按完整、简单或纯消息预设初始化文本配置,调用方仍可逐位调整输出组成。

bool xrtLogTextConfigInit(xlogtextconfig* pConfig, xlogtextstyle Style)

参数

参数方向约束说明
pConfig输出非空接收配置
Style输入合法预设XLOG_TEXT_FULL / SIMPLE / MESSAGE
返回值
返回含义失败时状态
true已初始化—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

format_text_buffer · 配置预设

	if ( !xrtLogTextConfigInit(&Config, XLOG_TEXT_LEVEL |
		XLOG_TEXT_MESSAGE) ) {

xrtLogTextConfigValidate函数

校验文本标志组合和固定 UTC 偏移。

bool xrtLogTextConfigValidate(const xlogtextconfig* pConfig)

参数

参数方向约束说明
pConfig输入非空待校验配置
返回值
返回含义失败时状态
true配置自洽—
false不自洽XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

sink_tour · 配置校验

			xrtLogTextConfigValidate(&TextConfig) ? 1 : 0);

xrtLogTextWrite函数

无中间整行分配地把记录按配置分段写给同步 Writer;Writer 失败时 pWritten 返回已提交的精确字节数。

bool xrtLogTextWrite(const xlogrecord* pRecord, const xlogtextconfig* pConfig, xlogwriteproc pWrite, ptr pUserData, size_t* pWritten)

参数

参数方向约束说明
pRecord输入非空且通过校验完整记录
pConfig输入非空且通过校验文本配置
pWrite输入非空字节 Writer 回调
pUserData输入任意值Writer 数据
pWritten输出允许空接收写出字节数
返回值
返回含义失败时状态
true已完整写出—
false记录、配置非法或 Writer 失败XERR_ARGUMENT / xrt.log 错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_TEXT_OUTPUT — Writer 返回失败但未设置具体错误

范例已编译验证

sink_tour · 流式写出

		if ( xrtLogTextWrite(&(xlogrecord){ 0 }, &TextConfig,
			writeSink, stdout, &iSize) ) {

xrtLogText函数

创建由 xrtFree 释放的完整文本记录,并返回不含末尾零字节的长度。

str xrtLogText(const xlogrecord* pRecord, const xlogtextconfig* pConfig, size_t* pSize)

参数

参数方向约束说明
pRecord输入非空且通过校验完整记录
pConfig输入非空且通过校验文本配置
pSize输出允许空接收文本长度
返回值
返回含义失败时状态
非空零结尾文本,xrtFree 释放—
NULL失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_TEXT_OUTPUT — Writer 返回失败但未设置具体错误
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

format_text_buffer · 分配整行

	sText = xrtLogText(&Record, &Config, &iSize);
JSON Lines 格式化

xrtLogJsonConfigInit函数

初始化完整、紧凑且以换行结束的 JSON Lines 配置。

bool xrtLogJsonConfigInit(xlogjsonconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
true已初始化—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

json · 默认配置

		!xrtLogJsonConfigInit(&Config) ||

xrtLogJsonConfigValidate函数

校验 JSON 标志、转义、字段表示、非有限数策略和错误原因深度。

bool xrtLogJsonConfigValidate(const xlogjsonconfig* pConfig)

参数

参数方向约束说明
pConfig输入非空待校验配置
返回值
返回含义失败时状态
true配置自洽—
false不自洽xrt.log / XLOG_ERROR_JSON_CONFIG
错误
  • xrt.log / XLOG_ERROR_JSON_CONFIG — 标志、策略组合或 MaxErrorDepth 非法

范例已编译验证

sink_tour · 配置校验

			xrtLogJsonConfigValidate(&JsonConfig) ? 1 : 0);

xrtLogJsonWrite函数

无中间对象和整行分配地把记录按配置分段写给同步 Writer;默认输出顺序 time、level、logger、message、source、thread、fields。

bool xrtLogJsonWrite(const xlogrecord* pRecord, const xlogjsonconfig* pConfig, xlogwriteproc pWrite, ptr pUserData, size_t* pWritten)

参数

参数方向约束说明
pRecord输入非空且通过校验完整记录
pConfig输入非空且通过校验JSON 配置
pWrite输入非空字节 Writer 回调
pUserData输入任意值Writer 数据
pWritten输出允许空接收写出字节数
返回值
返回含义失败时状态
true已完整写出—
false记录、配置、UTF-8 非法或 Writer 失败XERR_ARGUMENT / xrt.log / xrt.json 错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_JSON_CONFIG — 标志、策略组合或错误深度非法
  • xrt.log / XLOG_ERROR_JSON_OUTPUT — Writer 失败但未设置具体错误
  • xrt.json 域错误 — 字符串字段不是合法 UTF-8

范例已编译验证

json · 流式写出

		!xrtLogJsonWrite(
			&Record,
			&Config,
			exampleLogWrite,
			stdout,
			NULL
		)

xrtLogJson函数

创建由 xrtFree 释放的零结尾 JSON Lines 记录,并返回不含末尾零字节的长度。

str xrtLogJson(const xlogrecord* pRecord, const xlogjsonconfig* pConfig, size_t* pSize)

参数

参数方向约束说明
pRecord输入非空且通过校验完整记录
pConfig输入非空且通过校验JSON 配置
pSize输出允许空接收文本长度
返回值
返回含义失败时状态
非空零结尾 JSON 行,xrtFree 释放—
NULL失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_JSON_CONFIG — 标志、策略组合或错误深度非法
  • xrt.log / XLOG_ERROR_JSON_OUTPUT — Writer 失败但未设置具体错误
  • xrt.json 域错误 — 字符串字段不是合法 UTF-8
  • XERR_MEMORY — 缓冲分配失败

范例已编译验证

format_json_buffer · 分配整行

	sJson = xrtLogJson(&Record, &Config, &iSize);
Console Sink

xrtLogConsoleConfigInit函数

初始化适合交互程序的默认配置:INFO 阈值、完整文本、ERROR 起写 stderr、逐条刷新和自动配色。

bool xrtLogConsoleConfigInit(xlogconsoleconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
true已初始化—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

logger_tour · 默认配置

	(void)xrtLogConsoleConfigInit(&ConsoleConfig);

xrtLogConsole函数

创建调用方拥有的线程安全 Console Sink;配置在创建时完整复制。

xlogsink* xrtLogConsole(const xlogconsoleconfig* pConfig)

参数

参数方向约束说明
pConfig输入允许空空 = xrtLogConsoleConfigInit 默认值
返回值
返回含义失败时状态
非空Console Sink—
NULL配置非法或分配失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 内部结构分配失败
  • xrt.log / XLOG_ERROR_CONSOLE_CONFIG — 配置组合非法

范例已编译验证

logger_tour · 创建 Sink

		xlogsink* pConsoleSink = xrtLogConsole(&ConsoleConfig);

xrtLogAddConsole函数

创建 Console Sink 并附加到 Logger;成功后由 Logger 独占该引用。

bool xrtLogAddConsole(xlogger* pLogger, const xlogconsoleconfig* pConfig)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pConfig输入允许空空 = 默认配置
返回值
返回含义失败时状态
true已创建并附加—
false创建或附加失败XERR_ARGUMENT 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY — 内部结构分配失败
  • xrt.log / XLOG_ERROR_CONSOLE_CONFIG — 配置组合非法

范例已编译验证

console · 创建并附加

	if ( (pLogger == NULL) || !xrtLogAddConsole(pLogger, NULL) ) {
File Sink

xrtLogFileOptionsInit函数

初始化追加模式、INFO 阈值、16 MiB 单条上限、64 KiB 缓存保留和手动持久化选项,并复制路径文本。

bool xrtLogFileOptionsInit(xlogfileoptions* pOptions, cstr sPath)

参数

参数方向约束说明
pOptions输出非空接收选项
sPath输入非空且非空串UTF-8 文件路径
返回值
返回含义失败时状态
true已初始化并复制路径—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

file_text · 默认选项

		!xrtLogFileOptionsInit(&Options, "example_logger_text.log") ||

xrtLogFile函数

创建通用文件 Sink;成功后接管格式器 UserData,失败时数据仍归调用方。

xlogsink* xrtLogFile(const xlogfileconfig* pConfig)

参数

参数方向约束说明
pConfig输入非空且 Format 非空选项与格式回调
返回值
返回含义失败时状态
非空文件 Sink—
NULL配置非法或打开失败xrt.log 错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_FILE_CONFIG — 选项组合非法
  • xrt.log / XLOG_ERROR_FILE_OPEN — 打开失败,xrt.file 原因保留在原因链
  • XERR_RANGE — 路径长度引起尺寸溢出
  • XERR_MEMORY — 分配失败

范例已编译验证

file · 自定义格式器

	pSink = xrtLogFile(&Config);

xrtLogFilePath函数

返回文件 Sink 生命周期内稳定的借用 UTF-8 路径。

cstr xrtLogFilePath(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入文件 Sink目标 Sink
返回值
返回含义失败时状态
非空零结尾路径借用—
NULL非文件 Sink 或空句柄不设错
错误
  • 无错误 — 非文件 Sink 或空句柄返回 NULL 且不设置错误

范例已编译验证

sink_tour · 路径查询

				cstr sPath = xrtLogFilePath(pTextFileSink);

xrtLogFileStats函数

并发读取文件 Sink 的统计快照:当前大小、累计写入、记录、滚动、reopen 和持久化次数。

bool xrtLogFileStats(const xlogsink* pSink, xlogfilestats* pStats)

参数

参数方向约束说明
pSink输入文件 Sink目标 Sink
pStats输出非空接收统计
返回值
返回含义失败时状态
true统计已写出—
false非文件 Sink 或参数非法仅 pStats 为空时 XERR_ARGUMENT
错误
  • XERR_ARGUMENT — pStats 为空;非文件 Sink 返回 false 且不设置错误

范例已编译验证

sink_tour · 统计快照

					(void)xrtLogFileStats(pTextFileSink, &FileStats);

xrtLogFileRotate函数

立即执行滚动流程;零备份配置到达阈值后直接截断当前路径。

bool xrtLogFileRotate(xlogsink* pSink)

参数

参数方向约束说明
pSink输入文件 Sink目标 Sink
返回值
返回含义失败时状态
true已滚动—
false滚动失败xrt.log 错误
错误
  • xrt.log / XLOG_ERROR_FILE_ROTATE — 滚动失败,底层错误保留在原因链

范例已编译验证

sink_tour · 立即滚动

				(void)xrtLogFileRotate(pTextFileSink);

xrtLogFileReopen函数

重新打开当前路径,供外部 logrotate 或路径替换后切换句柄;先开新句柄再关旧句柄。

bool xrtLogFileReopen(xlogsink* pSink)

参数

参数方向约束说明
pSink输入文件 Sink目标 Sink
返回值
返回含义失败时状态
true已切换到新句柄—
false重开失败xrt.log 错误
错误
  • xrt.log / XLOG_ERROR_FILE_OPEN — 新句柄打开失败,原句柄保持有效

范例已编译验证

sink_tour · 重开句柄

				(void)xrtLogFileReopen(pTextFileSink);
文件组合层

xrtLogTextFile函数

使用复制的文本配置创建文件 Sink;空文本配置使用完整格式。

xlogsink* xrtLogTextFile(const xlogfileoptions* pOptions, const xlogtextconfig* pText)

参数

参数方向约束说明
pOptions输入非空文件选项
pText输入允许空空 = 完整文本格式
返回值
返回含义失败时状态
非空文本文件 Sink—
NULL创建失败同 xrtLogFile
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_FILE_CONFIG — 选项组合非法
  • xrt.log / XLOG_ERROR_FILE_OPEN — 打开失败,xrt.file 原因保留在原因链
  • XERR_RANGE — 路径长度引起尺寸溢出
  • XERR_MEMORY — 分配失败

范例已编译验证

sink_tour · 文本文件 Sink

			xlogsink* pTextFileSink = xrtLogTextFile(&Options, NULL);

xrtLogAddTextFile函数

创建文本文件 Sink 并附加到 Logger;成功后由 Logger 独占该引用。

bool xrtLogAddTextFile(xlogger* pLogger, const xlogfileoptions* pOptions, const xlogtextconfig* pText)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pOptions输入非空文件选项
pText输入允许空空 = 完整文本格式
返回值
返回含义失败时状态
true已创建并附加—
false创建或附加失败同 xrtLogFile
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_FILE_CONFIG — 选项组合非法
  • xrt.log / XLOG_ERROR_FILE_OPEN — 打开失败,xrt.file 原因保留在原因链
  • XERR_RANGE — 路径长度引起尺寸溢出
  • XERR_MEMORY — 分配失败

范例已编译验证

file_text · 创建并附加

		!xrtLogAddTextFile(pLogger, &Options, &Text) ||

xrtLogJsonFile函数

使用复制的 JSON 配置创建文件 Sink;空 JSON 配置使用完整 JSON Lines。

xlogsink* xrtLogJsonFile(const xlogfileoptions* pOptions, const xlogjsonconfig* pJson)

参数

参数方向约束说明
pOptions输入非空文件选项
pJson输入允许空空 = 完整 JSON Lines
返回值
返回含义失败时状态
非空JSON 文件 Sink—
NULL创建失败同 xrtLogFile
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_FILE_CONFIG — 选项组合非法
  • xrt.log / XLOG_ERROR_FILE_OPEN — 打开失败,xrt.file 原因保留在原因链
  • XERR_RANGE — 路径长度引起尺寸溢出
  • XERR_MEMORY — 分配失败

范例已编译验证

sink_tour · JSON 文件 Sink

			xlogsink* pJsonSink = xrtLogJsonFile(&Options, NULL);

xrtLogAddJsonFile函数

创建 JSON 文件 Sink 并附加到 Logger;成功后由 Logger 独占该引用。

bool xrtLogAddJsonFile(xlogger* pLogger, const xlogfileoptions* pOptions, const xlogjsonconfig* pJson)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pOptions输入非空文件选项
pJson输入允许空空 = 完整 JSON Lines
返回值
返回含义失败时状态
true已创建并附加—
false创建或附加失败同 xrtLogFile
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.log / XLOG_ERROR_FILE_CONFIG — 选项组合非法
  • xrt.log / XLOG_ERROR_FILE_OPEN — 打开失败,xrt.file 原因保留在原因链
  • XERR_RANGE — 路径长度引起尺寸溢出
  • XERR_MEMORY — 分配失败

范例已编译验证

file_json · 创建并附加

		!xrtLogAddJsonFile(pLogger, &Options, NULL) ||   /* 一行挂载 */
Async Sink

xrtLogAsyncConfigInit函数

初始化无额外线程栈、TRACE 透传、丢弃最新记录和优雅排空的默认配置。

bool xrtLogAsyncConfigInit(xlogasyncconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
true已初始化—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

async · 默认配置

	if ( !xrtLogAsyncConfigInit(&AsyncConfig) ) {

xrtLogAsync函数

创建有界异步包装 Sink 并启动唯一顺序工作线程;目标只增加引用,不接管调用方引用。

xlogsink* xrtLogAsync(xlogsink* pTarget, const xlogasyncconfig* pConfig)

参数

参数方向约束说明
pTarget输入非空被包装的目标 Sink
pConfig输入允许空空 = 默认配置
返回值
返回含义失败时状态
非空异步包装 Sink—
NULL创建或线程启动失败xrt.log 错误
错误
  • xrt.log / XLOG_ERROR_ASYNC_CONFIG — 目标为空或配置非法,kind 为 XERR_ARGUMENT
  • xrt.log / XLOG_ERROR_ASYNC_CONFIG — 状态分配失败(XERR_MEMORY)或目标引用失败(XERR_STATE)
  • xrt.log / XLOG_ERROR_ASYNC_THREAD — 工作线程启动失败

范例已编译验证

async · 创建包装器

	pAsync = xrtLogAsync(pTarget, &AsyncConfig);

xrtLogAddAsync函数

创建异步包装并附加到 Logger;成功后 Logger 独占新包装器的引用。

bool xrtLogAddAsync(xlogger* pLogger, xlogsink* pTarget, const xlogasyncconfig* pConfig)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pTarget输入非空被包装的目标 Sink
pConfig输入允许空空 = 默认配置
返回值
返回含义失败时状态
true已创建并附加—
false创建或附加失败同 xrtLogAsync
错误
  • xrt.log / XLOG_ERROR_ASYNC_CONFIG — 目标为空或配置非法,kind 为 XERR_ARGUMENT
  • xrt.log / XLOG_ERROR_ASYNC_CONFIG — 状态分配失败(XERR_MEMORY)或目标引用失败(XERR_STATE)
  • xrt.log / XLOG_ERROR_ASYNC_THREAD — 工作线程启动失败

范例已编译验证

ring_async · 创建并附加

		if ( !xrtLogAddAsync(pAsyncLogger, pTargetSink, &AsyncConfig) ) {

xrtLogAsyncTarget函数

返回 Async Sink 生命周期内稳定的借用目标;错误类型的 Sink 返回空指针。

xlogsink* xrtLogAsyncTarget(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入异步 Sink目标 Sink
返回值
返回含义失败时状态
非空目标 Sink 借用—
NULL非异步 Sink 或空句柄不设错
错误
  • 无错误 — 非异步 Sink 或空句柄返回 NULL 且不设置错误

范例已编译验证

ring_async · 目标查询

				xlogsink* pInner = xrtLogAsyncTarget(pAsyncWrapper);

xrtLogAsyncStats函数

并发读取异步统计:入队、处理、各类丢弃、失败、当前队列和高水位。

bool xrtLogAsyncStats(const xlogsink* pSink, xlogasyncstats* pStats)

参数

参数方向约束说明
pSink输入异步 Sink目标 Sink
pStats输出非空接收统计
返回值
返回含义失败时状态
true统计已写出—
false非异步 Sink 或参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

ring_async · 统计快照

			(void)xrtLogAsyncStats(NULL, &AsyncStats);

xrtLogAsyncLastError函数

返回后台最近一次目标或 Flush 错误的新引用;用后 xrtErrorFree 释放。

xerror* xrtLogAsyncLastError(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入异步 Sink目标 Sink
返回值
返回含义失败时状态
非空错误新引用—
NULL尚无错误或非异步 Sink不设错
错误
  • 无错误 — 尚无后台错误时返回 NULL 且不设置错误

范例已编译验证

ring_async · 后台错误

		pLastError = xrtLogAsyncLastError(NULL);
Ring Sink

xrtLogRingConfigInit函数

初始化无生产者分配、无生产者互斥等待的有界 Ring 默认配置。

bool xrtLogRingConfigInit(xlogringconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
true已初始化—
false参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

ring_async · 默认配置

		(void)xrtLogRingConfigInit(&RingConfig);

xrtLogRing函数

创建高吞吐 Ring 包装 Sink;目标只增加引用,不接管调用方引用。

xlogsink* xrtLogRing(xlogsink* pTarget, const xlogringconfig* pConfig)

参数

参数方向约束说明
pTarget输入非空被包装的目标 Sink
pConfig输入允许空空 = 默认配置
返回值
返回含义失败时状态
非空Ring 包装 Sink—
NULL创建或线程启动失败xrt.log 错误
错误
  • xrt.log / XLOG_ERROR_RING_CONFIG — 目标为空或配置非法,kind 为 XERR_ARGUMENT
  • xrt.log / XLOG_ERROR_RING_CONFIG — 状态分配失败(XERR_MEMORY)或目标引用失败(XERR_STATE)
  • xrt.log / XLOG_ERROR_RING_THREAD — 工作线程启动失败

范例已编译验证

ring_async · 创建包装器

				pWrapper = xrtLogRing(pTarget2, &RingConfig2);

xrtLogAddRing函数

创建 Ring 包装并附加到 Logger;成功后 Logger 独占新包装器引用。

bool xrtLogAddRing(xlogger* pLogger, xlogsink* pTarget, const xlogringconfig* pConfig)

参数

参数方向约束说明
pLogger输入非空目标 Logger
pTarget输入非空被包装的目标 Sink
pConfig输入允许空空 = 默认配置
返回值
返回含义失败时状态
true已创建并附加—
false创建或附加失败同 xrtLogRing
错误
  • xrt.log / XLOG_ERROR_RING_CONFIG — 目标为空或配置非法,kind 为 XERR_ARGUMENT
  • xrt.log / XLOG_ERROR_RING_CONFIG — 状态分配失败(XERR_MEMORY)或目标引用失败(XERR_STATE)
  • xrt.log / XLOG_ERROR_RING_THREAD — 工作线程启动失败

范例已编译验证

ring_async · 创建并附加

		if ( !xrtLogAddRing(pLogger, pTargetSink, &RingConfig) ) {

xrtLogRingTarget函数

返回 Ring 生命周期内稳定的借用目标;错误类型 Sink 返回空。

xlogsink* xrtLogRingTarget(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入Ring Sink目标 Sink
返回值
返回含义失败时状态
非空目标 Sink 借用—
NULL非 Ring Sink 或空句柄不设错
错误
  • 无错误 — 非 Ring Sink 或空句柄返回 NULL 且不设置错误

范例已编译验证

ring_async · 目标查询

					xlogsink* pInner = xrtLogRingTarget(pWrapper);

xrtLogRingStats函数

读取无锁统计快照:容量丢弃、记录超限、递归写入和目标结果;并发字段之间不承诺同一时刻一致。

bool xrtLogRingStats(const xlogsink* pSink, xlogringstats* pStats)

参数

参数方向约束说明
pSink输入Ring Sink目标 Sink
pStats输出非空接收统计
返回值
返回含义失败时状态
true统计已写出—
false非 Ring Sink 或参数非法XERR_ARGUMENT
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

ring_async · 统计快照

				(void)xrtLogRingStats(NULL, &RingStats);

xrtLogRingLastError函数

返回后台最近一次错误的新引用;用后 xrtErrorFree 释放。

xerror* xrtLogRingLastError(const xlogsink* pSink)

参数

参数方向约束说明
pSink输入Ring Sink目标 Sink
返回值
返回含义失败时状态
非空错误新引用—
NULL尚无错误或非 Ring Sink不设错
错误
  • 无错误 — 尚无后台错误时返回 NULL 且不设置错误

范例已编译验证

ring_async · 后台错误

			pLastError = xrtLogRingLastError(NULL);
printf 提交

xrtLogPrintfV函数

使用 printf 规则和已有参数列表提交常用日志;复用字符串模块的安全格式化器,拒绝 %n。

xlogresult xrtLogPrintfV(xlogger* pLogger, xloglevel Level, cstr sFormat, va_list Args)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
sFormat输入非空printf 格式串
Args输入已由 va_start 初始化变参列表
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空
  • xrt.str 域错误 — 格式串非法(含 %n)或与实参不匹配

范例已编译验证

sink_tour · va_list 提交

	Result = xrtLogPrintfV(pLogger, XLOG_INFO, sFmt, Args);

xrtLogPrintf函数

使用 printf 规则提交常用日志;已得到消息视图时应改用无分配的 xrtLog。

xlogresult xrtLogPrintf(xlogger* pLogger, xloglevel Level, cstr sFormat, ...)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
sFormat输入非空printf 格式串
...输入与格式串匹配变参
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空
  • xrt.str 域错误 — 格式串非法(含 %n)或与实参不匹配

范例已编译验证

printf · 格式化提交

		Result = xrtLogPrintf(
			pLogger,
			XLOG_INFO,
			"request=%u status=%u",
			42u,
			200u
		);

xrtLogFieldsPrintfV函数

使用 printf 规则和已有参数列表提交带结构化字段的记录。

xlogresult xrtLogFieldsPrintfV(xlogger* pLogger, xloglevel Level, const xlogfield* pFields, size_t iFieldCount, cstr sFormat, va_list Args)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
pFields输入借用数组;计数为 0 时可空字段数组
iFieldCount输入—字段数量
sFormat输入非空printf 格式串
Args输入已由 va_start 初始化变参列表
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空
  • xrt.str 域错误 — 格式串非法(含 %n)或与实参不匹配

范例已编译验证

sink_tour · 字段 + va_list

	Result = xrtLogFieldsPrintfV(pLogger, XLOG_INFO, NULL, 0u, sFmt, Args);

xrtLogFieldsPrintf函数

使用 printf 规则提交带结构化字段的记录。

xlogresult xrtLogFieldsPrintf(xlogger* pLogger, xloglevel Level, const xlogfield* pFields, size_t iFieldCount, cstr sFormat, ...)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
pFields输入借用数组;计数为 0 时可空字段数组
iFieldCount输入—字段数量
sFormat输入非空printf 格式串
...输入与格式串匹配变参
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空
  • xrt.str 域错误 — 格式串非法(含 %n)或与实参不匹配

范例已编译验证

sink_tour · 字段 + 格式化

		(void)xrtLogFieldsPrintf(pLogger, XLOG_ERROR, Fields, 1u,
			"count=%d", 1);

xrtLogSourcePrintfV函数

使用 printf 规则和已有参数列表提交带完整源码元数据的记录。

xlogresult xrtLogSourcePrintfV(xlogger* pLogger, xloglevel Level, const xlogfield* pFields, size_t iFieldCount, xstrview File, xstrview Function, uint32 iLine, uint64 iThreadId, cstr sFormat, va_list Args)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
pFields输入借用数组;计数为 0 时可空字段数组
iFieldCount输入—字段数量
File输入借用;可空视图源文件名
Function输入借用;可空视图函数名
iLine输入—行号
iThreadId输入—线程标识,0 = 不记录
sFormat输入非空printf 格式串
Args输入已由 va_start 初始化变参列表
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空
  • xrt.str 域错误 — 格式串非法(含 %n)或与实参不匹配

范例已编译验证

sink_tour · 完整元数据 + va_list

	Result = xrtLogSourcePrintfV(pLogger, Level, NULL, 0u, SV("demo.c"), SV("main"), 1u, 0u, sFmt, Args);

xrtLogSourcePrintf函数

使用 printf 规则提交带完整源码元数据的记录。

xlogresult xrtLogSourcePrintf(xlogger* pLogger, xloglevel Level, const xlogfield* pFields, size_t iFieldCount, xstrview File, xstrview Function, uint32 iLine, uint64 iThreadId, cstr sFormat, ...)

参数

参数方向约束说明
pLogger输入非空目标 Logger
Level输入合法级别本条级别
pFields输入借用数组;计数为 0 时可空字段数组
iFieldCount输入—字段数量
File输入借用;可空视图源文件名
Function输入借用;可空视图函数名
iLine输入—行号
iThreadId输入—线程标识,0 = 不记录
sFormat输入非空printf 格式串
...输入与格式串匹配变参
返回值
返回含义失败时状态
XLOG_RESULT_WRITTEN至少一个 Sink 完成写入—
XLOG_RESULT_SKIPPED被 Logger 或 Sink 阈值过滤不设错
XLOG_RESULT_DROPPED未写入,但至少一个 Sink 按自身策略丢弃不设错
XLOG_RESULT_ERROR记录非法或至少一个 Sink 真实错误XERR_ARGUMENT 或 xrt.log 错误
错误
  • XERR_ARGUMENT — 句柄为空
  • xrt.str 域错误 — 格式串非法(含 %n)或与实参不匹配

范例已编译验证

sink_tour · 完整元数据 + 格式化

	(void)xrtLogSourcePrintf(pLogger, XLOG_WARN, NULL, 0u,
		SV("demo.c"), SV("main"), 1u, 0u, "src=%s", "printf");
补充参考 · 契约见公共头注释

xrtLogTakeDefaultIf函数

契约注释见公共头文件。

XRT_API xlogger* xrtLogTakeDefaultIf(xlogger* pExpected)

xrtLogFileClose函数

契约注释见公共头文件。

XRT_API bool xrtLogFileClose(xlogsink* pSink)

xrtLogAsyncStop函数

契约注释见公共头文件。

XRT_API bool xrtLogAsyncStop(xlogsink* pSink)

xrtLogRingStop函数

契约注释见公共头文件。

XRT_API bool xrtLogRingStop(xlogsink* pSink)

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XLOG_ASYNC_BLOCK见头文件注释
XLOG_ASYNC_BYTE_LIMIT_DEFAULT见头文件注释
XLOG_ASYNC_CAPACITY_DEFAULT见头文件注释
XLOG_ASYNC_DISCARD见头文件注释
XLOG_ASYNC_DRAIN见头文件注释
XLOG_ASYNC_DROP_NEWEST见头文件注释
XLOG_ASYNC_DROP_OLDEST见头文件注释
XLOG_ASYNC_RECORD_LIMIT_DEFAULT见头文件注释
XLOG_CONSOLE_COLOR_ALWAYS见头文件注释
XLOG_CONSOLE_COLOR_AUTO见头文件注释
XLOG_CONSOLE_COLOR_NEVER见头文件注释
XLOG_CONSOLE_SPLIT见头文件注释
XLOG_CONSOLE_STDERR见头文件注释
XLOG_CONSOLE_STDOUT见头文件注释
XLOG_DEBUG见头文件注释
XLOG_ERROR见头文件注释
XLOG_ERROR_ASYNC_CLOSED见头文件注释
XLOG_ERROR_ASYNC_CONFIG见头文件注释
XLOG_ERROR_ASYNC_FLUSH见头文件注释
XLOG_ERROR_ASYNC_QUEUE见头文件注释
XLOG_ERROR_ASYNC_RECORD见头文件注释
XLOG_ERROR_ASYNC_TARGET见头文件注释
XLOG_ERROR_ASYNC_THREAD见头文件注释
XLOG_ERROR_CALLBACK见头文件注释
XLOG_ERROR_CONSOLE_CONFIG见头文件注释
XLOG_ERROR_CONSOLE_FLUSH见头文件注释
XLOG_ERROR_CONSOLE_WRITE见头文件注释
XLOG_ERROR_FILE_CLOSE见头文件注释
XLOG_ERROR_FILE_CONFIG见头文件注释
XLOG_ERROR_FILE_FORMAT见头文件注释
XLOG_ERROR_FILE_LIMIT见头文件注释
XLOG_ERROR_FILE_OPEN见头文件注释
XLOG_ERROR_FILE_ROTATE见头文件注释
XLOG_ERROR_FILE_SYNC见头文件注释
XLOG_ERROR_FILE_WRITE见头文件注释
XLOG_ERROR_JSON_CONFIG见头文件注释
XLOG_ERROR_JSON_DEPTH见头文件注释
XLOG_ERROR_JSON_OUTPUT见头文件注释
XLOG_ERROR_JSON_VALUE见头文件注释
XLOG_ERROR_RING_CLOSED见头文件注释
XLOG_ERROR_RING_CONFIG见头文件注释
XLOG_ERROR_RING_FLUSH见头文件注释
XLOG_ERROR_RING_QUEUE见头文件注释
XLOG_ERROR_RING_TARGET见头文件注释
XLOG_ERROR_RING_THREAD见头文件注释
XLOG_ERROR_TEXT_OUTPUT见头文件注释
XLOG_FATAL见头文件注释
XLOG_FIELD_BOOL见头文件注释
XLOG_FIELD_ERROR见头文件注释
XLOG_FIELD_FLOAT见头文件注释
XLOG_FIELD_INT见头文件注释
XLOG_FIELD_NULL见头文件注释
XLOG_FIELD_STRING见头文件注释
XLOG_FIELD_TIME见头文件注释
XLOG_FIELD_UINT见头文件注释
XLOG_FILE_APPEND见头文件注释
XLOG_FILE_BUFFER_LIMIT_DEFAULT见头文件注释
XLOG_FILE_RECORD_LIMIT_DEFAULT见头文件注释
XLOG_FILE_SYNC_INTERVAL见头文件注释
XLOG_FILE_SYNC_MANUAL见头文件注释
XLOG_FILE_SYNC_RECORD见头文件注释
XLOG_FILE_TRUNCATE见头文件注释
XLOG_INFO见头文件注释
XLOG_JSON_ERROR_DEPTH_DEFAULT见头文件注释
XLOG_JSON_FIELDS见头文件注释
XLOG_JSON_FIELDS_ARRAY见头文件注释
XLOG_JSON_FIELDS_OBJECT见头文件注释
XLOG_JSON_LEVEL见头文件注释
XLOG_JSON_LOGGER见头文件注释
XLOG_JSON_MESSAGE见头文件注释
XLOG_JSON_NEWLINE见头文件注释
XLOG_JSON_NONFINITE_NULL见头文件注释
XLOG_JSON_NONFINITE_REJECT见头文件注释
XLOG_JSON_NONFINITE_STRING见头文件注释
XLOG_JSON_SOURCE见头文件注释
XLOG_JSON_THREAD见头文件注释
XLOG_JSON_TIME见头文件注释
XLOG_OFF见头文件注释
XLOG_RESULT_DROPPED见头文件注释
XLOG_RESULT_ERROR见头文件注释
XLOG_RESULT_SKIPPED见头文件注释
XLOG_RESULT_WRITTEN见头文件注释
XLOG_RING_BATCH_DEFAULT见头文件注释
XLOG_RING_BATCH_MAX见头文件注释
XLOG_RING_CAPACITY_DEFAULT见头文件注释
XLOG_RING_IDLE_WAIT_DEFAULT见头文件注释
XLOG_RING_RECORD_LIMIT_DEFAULT见头文件注释
XLOG_TEXT_FIELDS见头文件注释
XLOG_TEXT_FULL见头文件注释
XLOG_TEXT_LEVEL见头文件注释
XLOG_TEXT_LOGGER见头文件注释
XLOG_TEXT_MESSAGE见头文件注释
XLOG_TEXT_NEWLINE见头文件注释
XLOG_TEXT_RAW_MESSAGE见头文件注释
XLOG_TEXT_SIMPLE见头文件注释
XLOG_TEXT_SOURCE见头文件注释
XLOG_TEXT_THREAD见头文件注释
XLOG_TEXT_TIME见头文件注释
XLOG_TRACE见头文件注释
XLOG_WARN见头文件注释