5.8 KiB
5.8 KiB
新增功能模块 / 模块重构
适用场景:新增模块、重大模块重构、核心架构能力演进。 不适用场景:小接口或轻量功能变更,请使用“功能变更”模板。
基本信息
- 模块 ID:Module-20260109-0001
- 模块名称: SxLog 轻量日志系统
- 状态:已完成(历史记录;本次仅归档,未重新验证)
- 类型:新增模块
- 所属系统 / 子系统: StellarX / Logging / Diagnostics
- 版本 / 分支: v3.0.0 / master
- 环境: Windows x64 / Visual Studio 2022 / Debug、Release / 控制台模式
- 负责人: Ysm-04(历史实现)
背景与目标
- 背景: Canvas、TabControl、Table 以及快照重绘链路逐渐复杂,仅依靠断点难以还原事件、重绘和状态变化顺序。
- 当前痛点:
- 缺少统一的日志级别、Tag 过滤和输出渠道。
- 分散日志难以控制噪声,也难以保存为可回放证据。
- 协作和对外输出需要中英文文本选择能力。
- 目标:
- 提供统一日志入口和宏封装。
- 支持级别控制、Tag 白名单/黑名单、控制台输出、文件输出和按大小滚动。
- 提供
SX_T/SxT双语文本选择以及作用域耗时记录。
- 非目标:[可选]
- 不负责字符编码转换。
- 不依赖 WinAPI 调试输出通道,不引入第三方日志库。
- 不保证高频同步 I/O 场景下无性能影响。
模块边界
- 职责:
SxLogger负责配置、过滤、格式化与 Sink 分发。ConsoleSink、FileSink负责具体输出。SxLogLine通过 RAII 完成流式拼接和行提交。SxLogScope记录作用域耗时。
- 不负责什么:
- 不负责日志采集服务、网络上报、结构化查询或跨进程聚合。
- 不对业务敏感信息进行脱敏。
- 外部依赖:
- C++ 标准库的流、文件、互斥量、原子变量和时间工具。
setGBK()面向 Windows 控制台环境。
- 对外能力 / API:
SxLogger::Get()、setMinLevel()、setTagFilter()、clearTagFilter()。enableConsole()、enableFile()、disableFile()。setLanguage()、setGBK()。SX_LOG_TRACE、SX_LOGD/I/W/E/F、SX_TRACE_SCOPE、SX_T/SxT。
- 关键数据 / 状态:
SxLogConfig保存级别、格式、Tag 策略以及文件配置。- Logger 单例持有配置和 Sink;语言选择使用原子状态。
设计说明
- 核心流程:
- 日志宏先调用
shouldLog()判断级别、Tag 和可用 Sink。 - 命中条件时构造
SxLogLine并进行流式拼接。 SxLogLine析构时提交完整日志行。SxLogger::logLine()在互斥保护下格式化并分发给控制台和文件 Sink。
- 日志宏先调用
- 关键对象 / 类关系:
SxLogger:中心配置与分发器。ILogSink:输出目标抽象。ConsoleSink/FileSink:具体输出实现。SxLogLine/SxLogScope:调用端 RAII 辅助对象。
- 生命周期:
- Logger 为进程内单例;Sink 随配置启用或关闭。
- 日志行对象只在命中过滤条件时短暂存在,并在析构时提交。
- 事件 / 渲染 / 数据流:[按模块类型填写]
- 调用点 -> 宏短路 -> 日志行拼接 -> Logger 过滤/格式化 -> Sink 输出。
- 关键不变量:
shouldLog()返回 false 时不应构造日志行或执行字符串拼接。- 单条日志必须作为整体写出,不能被其他线程插入破坏。
- 语言切换只选择文本,不进行编码转换。
- 未启用任何 Sink 时应直接短路。
- 降级 / 回退策略:[可选]
- 将最低级别设为 Off,或关闭控制台和文件 Sink。
- 必要时通过编译期开关关闭日志宏。
实现与影响
- 关键实现点:
- Tag 过滤使用适合少量 Tag 的线性查找。
- 文件输出支持追加和按字节阈值滚动。
- 输出阶段使用互斥量保证行级串行;语言状态使用原子变量。
- 涉及文件 / 类 / 函数:
- 历史路径:
include/StellarX/SxLog.h - 历史路径:
src/SxLog.cpp SxLogger、SxLogConfig、ILogSink、ConsoleSink、FileSink、SxLogLine、SxLogScope
- 历史路径:
- 兼容性影响:
- 新增独立模块,不改变既有控件公共 API;调用方可选择是否接入。
- 性能影响:
- 未命中过滤条件时由宏短路降低开销。
- 命中时存在格式化、互斥和 I/O 成本;高频 Trace 输出可能成为瓶颈并快速增大日志文件。
- 风险点:
- 文件权限、文件占用或滚动重命名失败可能影响持续写入。
- 控制台代码页差异可能导致中文显示不一致。
- 日志内容如果包含敏感数据,需要由调用方自行控制。
测试与验证
- 测试范围:
- 日志级别、Tag 白名单/黑名单、控制台和文件输出、文件滚动、语言切换、不可写路径。
- 验证步骤:
- 启用控制台并依次输出不同级别,检查格式、级别和语言文本。
- 启用文件输出,验证追加写、Tag 过滤以及不可写路径的返回值。
- 使用较小的滚动阈值持续输出,检查旧文件重命名和新文件续写。
- 验证结果:
- PDF 给出了上述测试方案,但“验证证据”仍是待填占位内容,没有附带日志、截图或性能数据。
- 本次只确认模块源码、公共接口、提交和发布记录存在,未重新执行运行时测试。
- 已知限制 / 遗留问题:[可选]
- 同步互斥和文件 I/O 不适合无约束的高频热路径。
setGBK()只调整终端解释输出的方式,不进行字符串编码转换。
落地信息
- 关联功能变更 ID:[可选]
- 关联 BUG / Fix:[可选]
- Commit:
5cb59b36525cde93de83313551296c6458694110 - PR:[可选]
- 发布版本:[可选] v3.0.0
- 相关文档:[可选]
StellarX功能_模块变更.pdf第 24-28 页。- 历史
CHANGELOG.md的 v3.0.0 条目。