Skip to content

【重大Bug】日志系统未严格过滤级别,导致日志信息丢失或过度输出 #888

@hotlong

Description

@hotlong

问题摘要

排查 objectstack-ai/spec 日志系统发现,日志过滤机制存在多个严重缺陷,导致日志级别配置无效、日志丢失或过度输出。


问题 1:浏览器环境下缺少日志级别过滤

  • logger.ts 中,所有 debug/info/warn/error 方法在浏览器环境直接输出,没有根据配置的 level 判断是否应该打印。
  • 如设置 level='warn'debug()info() 仍然输出。

问题 2:Node端 Pino 日志器异步初始化造成启动日志丢失。

  • logger 构造函数 initPinoLogger() 异步执行,日志调用早于初始化时会 fallback 到 console,日志结构及级别可能失真。

问题 3:SchemaRegistry 日志过滤过于粗暴

  • 仅有一个log()方法,无warnerror分级,logLevel='warn'|'error'会导致所有注册/注销等日志静默丢失。

问题 4:silent 级别无效

  • browser 下 silent 依然输出日志。

问题 5:测试未验证输出是否被正确过滤

  • logger.test.ts 只检查不抛异常,并未断言实际 console 输出,无法发现过滤失效问题。

推荐修复方案

  1. 补充浏览器端日志级别过滤:
    • 增加 shouldLog(level) 方法,根据 config.level 检查优先级,过滤低级别日志。
  2. Pino初始化竞态修复:
    • 支持异步/ready钩子,初始化完毕前缓存日志或直接丢弃。
  3. SchemaRegistry 增加分级日志支持:
    • log/info/warn/error 四个方法,优先级比较后输出到相应 console API。
  4. 修正 silent 级别逻辑。
  5. 单元测试增强,验证实际console输出与filter逻辑。

受影响范围

  • packages/core/src/logger.ts
  • packages/objectql/src/registry.ts
  • packages/core/src/logger.test.ts

如需代码实现及PR,请通知我。

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions