You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nest.js测试报错:已继承ConsoleLogger仍提示禁止继承Logger

错误出现的原因

  • 开发环境正常是因为你在NestFactory.create阶段手动传入了实例化的ReportLogger,直接覆盖了Nest默认的日志实现,不会触发旧版Logger的校验逻辑。
  • 测试场景下默认没有配置自定义Logger,Test.createTestingModule在编译模块时会自动扫描所有Provider的日志实现,只要检测到任何继承自旧版Logger类的用法就会抛出该错误,常见的隐性触发场景包括:
    1. 某个业务代码中还有直接实例化/注入@nestjs/common导出的旧版Logger类的写法
    2. 你的ReportLogger没有在测试模块中注册,Nest默认fallback到了旧版日志校验逻辑
    3. 你在测试实例化应用时没有传入和生产一致的日志配置
    4. 存在以旧版Logger作为依赖注入键的Provider声明

修复步骤

  1. 全局检查所有业务代码的Logger导入,确保所有日志相关的实例化、继承都使用@nestjs/common导出的ConsoleLogger,而非旧版Logger。
  2. 调整测试代码,给测试模块和测试应用配置和main.ts一致的自定义Logger:
const moduleFixture: TestingModule = await Test.createTestingModule({
  imports: [AppModule],
})
// 给测试模块指定自定义Logger
.setLogger(new ReportLogger())
.compile();

// 实例化测试应用时传入相同的日志配置
app = moduleFixture.createNestApplication({
  bufferLogs: true,
  logger: new ReportLogger(),
});
  1. 排查AppModule的Provider声明:
    • 如果将ReportLogger声明为全局Provider,补充完整的声明避免Nest误识别:
      {
        provide: ReportLogger,
        useClass: ReportLogger
      }
      
    • 如果存在以旧版Logger作为注入键的写法,替换为自定义Token或者ConsoleLogger:
      // 错误写法,会触发校验
      {
        provide: Logger,
        useClass: ReportLogger
      }
      // 修正后写法
      {
        provide: 'REPORT_LOGGER',
        useClass: ReportLogger
      }
      
  2. 如果排查后还是报错,可以临时将测试用的Logger替换为内置的ConsoleLogger验证,如果替换后不再报错,说明你的ReportLogger实现中仍有未排查到的旧版Logger引用。

内容的提问来源于stack exchange,提问作者Sea Monster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 02:27:04