Files
StellarX-kaifa/开发记录/模块/Module-20260109-0001-SxLog轻量日志系统.md
T

128 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 新增功能模块 / 模块重构
> 适用场景:新增模块、重大模块重构、核心架构能力演进。
> 不适用场景:小接口或轻量功能变更,请使用“功能变更”模板。
## 基本信息
- 模块 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;语言选择使用原子状态。
## 设计说明
- 核心流程:
1. 日志宏先调用 `shouldLog()` 判断级别、Tag 和可用 Sink。
2. 命中条件时构造 `SxLogLine` 并进行流式拼接。
3. `SxLogLine` 析构时提交完整日志行。
4. `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 白名单/黑名单、控制台和文件输出、文件滚动、语言切换、不可写路径。
- 验证步骤:
1. 启用控制台并依次输出不同级别,检查格式、级别和语言文本。
2. 启用文件输出,验证追加写、Tag 过滤以及不可写路径的返回值。
3. 使用较小的滚动阈值持续输出,检查旧文件重命名和新文件续写。
- 验证结果:
- PDF 给出了上述测试方案,但“验证证据”仍是待填占位内容,没有附带日志、截图或性能数据。
- 本次只确认模块源码、公共接口、提交和发布记录存在,未重新执行运行时测试。
- 已知限制 / 遗留问题:[可选]
- 同步互斥和文件 I/O 不适合无约束的高频热路径。
- `setGBK()` 只调整终端解释输出的方式,不进行字符串编码转换。
## 落地信息
- 关联功能变更 ID:[可选]
- 关联 BUG / Fix:[可选]
- Commit: `5cb59b36525cde93de83313551296c6458694110`
- PR:[可选]
- 发布版本:[可选] v3.0.0
- 相关文档:[可选]
- `StellarX功能_模块变更.pdf` 第 24-28 页。
- 历史 `CHANGELOG.md` 的 v3.0.0 条目。