GFramework/ai-plan/public/godot-logging-compliance-polish/traces/godot-logging-compliance-polish-trace.md
gewuyou b4b3538b21 fix(godot): 收敛日志配置评审问题
- 修复 GodotLog 配置源生命周期、Shutdown 释放与延迟 logger 并发发布问题

- 修复 Godot logger 配置归一化、无效数字级别校验和未知级别颜色回退

- 优化 Godot 日志模板缓存边界、内部文档和 update-namespaces 脚本失败传播

- 补充 Godot logging 回归测试、用户文档与 active ai-plan 恢复记录
2026-05-02 22:43:07 +08:00

4.6 KiB
Raw Blame History

Godot Logging Compliance Polish 追踪

2026-05-02

阶段GodotLogger 优点吸收与宿主层补齐RP-001

  • 复核 GodotLoggerGFramework.Godot.Logging 后确认:
    • 模板、颜色、Debug/Release 双模式、类别缩写和 Godot 输出路由已基本吸收
    • 真正缺口主要在宿主接入与运行期配置层,而不是输出格式层
  • 本轮新建 godot-logging-compliance-polish topic并将当前分支 feat/godot-logging-compliance-polish 映射到该主题
  • GFramework.Godot.Logging 新增:
    • GodotLog
    • DeferredLogger
    • GodotLogConfigurationSource
    • GodotLoggerSettings
    • GodotLoggerSettingsLoader
  • 关键实现决策:
    • 不把 Microsoft.Extensions.Logging 的 builder / provider 生态整套移植进来
    • 保持 LoggerFactoryResolverArchitectureConfiguration 仍是主接线方式
    • 只吸收 GodotLogger 里对 GFramework 现有模型真正有价值的部分:
      • 配置自动发现
      • 热重载
      • 延迟 logger 初始化
      • 配置命名兼容
  • 为让热重载作用于已缓存 logger调整 AbstractLogger 支持动态最小级别提供器,并让 GodotLoggerFactoryProvider / GodotLogger 在写入和级别判定时读取最新设置
  • 为让结构化日志在 Godot 侧不再退化成纯字符串,扩展:
    • GodotLogRenderContext
    • GodotLogTemplate
    • GodotLoggerOptions
    • GodotLogger 使默认模板支持 {properties},并将 IStructuredLogger / LogContext 属性渲染到输出中
  • 为兼容 GodotLogger 原项目配置习惯,在 GodotLoggerSettingsLoader 中补充枚举解析兼容:
    • Info / Information
    • Fatal / Critical
    • Warn / Warning
  • 同步更新 docs/zh-CN/godot/logging.md,把文档结论从“只有薄适配层”刷新成“已具备宿主便利层和热重载语义”
  • 已从 ai-libs/GodotLogger 复制 MIT 许可证到 third-party-licenses/GodotLogger/LICENSE

验证

  • dotnet test GFramework.Godot.Tests/GFramework.Godot.Tests.csproj -c Release --filter FullyQualifiedName~GodotLog -nologo
    • 结果通过11/11
  • dotnet test GFramework.Godot.Tests/GFramework.Godot.Tests.csproj -c Release -nologo
    • 结果通过69/69
  • dotnet test GFramework.Core.Tests/GFramework.Core.Tests.csproj -c Release --filter FullyQualifiedName~Logging -nologo
    • 结果通过214/214

下一步

  1. 若继续推进本主题,优先评估 Godot 输出是否应变成 Core 可组合 appender / sink
  2. 若出现后续 review 反馈,直接在本 topic 追加 RP-002而不是重新开临时 local-plan
  3. 若本主题阶段性完成,再把详细实现 history 迁入 archive/active 入口只保留恢复点与风险

阶段PR review hardeningRP-002

  • 使用 $gframework-pr-review 抓取 PR #314 最新 review payload确认当前 head 上仍有 CodeRabbit 与 Greptile 未解决线程
  • 接受并处理仍适用的 review 结论:
    • GodotLog.ConfigurationPath 不应提前创建全局配置源,Configure(...) 需要在 provider 或配置源已创建后 fail-fast
    • 静态配置源需要可显式释放 watcher因此新增 GodotLog.Shutdown()
    • DeferredLogger 首次解析改为 Interlocked.CompareExchange 发布,避免 _inner ??= 并发竞态
    • GodotLogger 结构化 Log(...) 覆写改为复用 IsEnabled(level),删除重复的最小级别 provider 字段
    • JSON 配置输入需要归一化模板和颜色字典,并拒绝未定义的数字 LogLevel
    • GodotLogTemplate 模板缓存和分类缓存需要有界,避免热重载或动态 category 长期增长
    • refactor-scripts/update-namespaces.py 不能依赖本机绝对路径,也不能把文件处理异常吞成 0 次替换
  • 同步补充 Godot logging 内部类型和关键方法 XML 文档,说明热重载、快照发布、分类匹配和模板缓存语义
  • 同步更新 docs/zh-CN/godot/logging.md,记录 ConfigurationPath 的诊断语义和 Shutdown() teardown 用法

验证

  • dotnet test GFramework.Godot.Tests/GFramework.Godot.Tests.csproj -c Release --filter FullyQualifiedName~GodotLog -nologo
    • 结果通过14/14
  • dotnet test GFramework.Godot.Tests/GFramework.Godot.Tests.csproj -c Release -nologo
    • 结果通过72/72
  • python3 -B refactor-scripts/update-namespaces.py --help
    • 结果:通过

下一步

  1. 提交 RP-002 review hardening 改动
  2. 刷新 PR review / CI确认最新 head 是否关闭已处理线程
  3. 若 CI 仍只有 MegaLinter dotnet-format restore 失败,优先定位 Actions restore 环境