NestJS 内置 Logger 概述
NestJS 自带 ConsoleLogger 类,开箱即用,无需安装额外依赖。它提供六个日志等级方法:log、error、warn、debug、verbose、fatal,默认输出到控制台,适合开发阶段和简单场景。
开关与过滤
在 main.ts 的 NestFactory.create() 第二个参数中控制日志行为:
// 完全关闭日志
const app = await NestFactory.create(AppModule, { logger: false });
// 仅输出指定等级
const app = await NestFactory.create(AppModule, {
logger: ['error', 'warn', 'log'],
});
// 开启全部(默认行为)
const app = await NestFactory.create(AppModule, { logger: true });
typescript
logger 接受的类型定义来自 LogLevel,有效值为 'log' | 'error' | 'warn' | 'debug' | 'verbose' | 'fatal'。TypeScript 会在编译时检查——输入 '123' 等非法值会直接报错。
基本使用
在 main.ts 中直接实例化:
import { Logger } from '@nestjs/common';
const logger = new Logger();
const port = 3000;
logger.log(`Application is running on port ${port}`); // 绿色
logger.warn(`Something needs attention`); // 黄色
logger.error(`Something went wrong`); // 红色
typescript
不同等级在终端中会以不同颜色区分:log 绿色、warn 黄色、error 红色。
在 Controller/Service 中使用
每个类实例化自己的 Logger,通过构造函数参数传入上下文名称,方便区分日志来源:
import { Controller, Get, Logger } from '@nestjs/common';
@Controller('users')
export class UserController {
private readonly logger = new Logger(UserController.name);
@Get()
findAll() {
this.logger.log('Request GET /users succeeded');
return { data: [] };
}
}
typescript
输出效果:
[Nest] 12345 - 2026/05/19 LOG [UserController] Request GET /users succeeded
text
日志前缀 [UserController] 标明了输出模块。在多个模块都打印类似内容(如"请求成功")时,上下文名称是快速定位来源的关键。
注意:Logger 不是通过依赖注入使用的,而是每个类直接
new Logger(ClassName.name)创建局部实例。它相对独立,不需要通过模块 providers 注册。
局限性
内置 Logger 只输出到控制台(stdout/stderr),不支持文件写入、日志滚动、结构化 JSON 等生产级功能。如果需要:
- 文件持久化 → 使用 Winston 或 Pino
- 结构化 JSON → 使用 Pino(默认 JSON 输出)
- 日志滚动 → Winston 的
DailyRotateFile或 Pino 的 file transport - 请求上下文自动绑定 →
nestjs-pino的AsyncLocalStorage
对于纯开发调试场景,内置 Logger 已经足够。官方文档也提供了扩展 ConsoleLogger 或实现 LoggerService 接口来自定义日志行为的方式。
自定义 Logger
实现 LoggerService 接口创建完全自定义的日志服务:
import { LoggerService, Injectable } from '@nestjs/common';
@Injectable()
export class CustomLogger implements LoggerService {
log(message: any, ...optionalParams: any[]) { /* 自定义实现 */ }
error(message: any, ...optionalParams: any[]) { /* 自定义实现 */ }
warn(message: any, ...optionalParams: any[]) { /* 自定义实现 */ }
debug?(message: any, ...optionalParams: any[]) { /* 自定义实现 */ }
verbose?(message: any, ...optionalParams: any[]) { /* 自定义实现 */ }
fatal?(message: any, ...optionalParams: any[]) { /* 自定义实现 */ }
}
typescript
或继承 ConsoleLogger 仅覆盖需要修改的方法:
import { ConsoleLogger, Injectable, Scope } from '@nestjs/common';
@Injectable({ scope: Scope.TRANSIENT })
export class MyLogger extends ConsoleLogger {
override log(message: string) {
// 添加自定义逻辑后调用父类
super.log(message);
}
}
typescript
NestJS v11 对内置 Logger 做了增强:更好的深层对象/数组格式化、原生支持 Map/Set 数据结构、新增 IntrinsicException 类用于跳过框架自动异常日志。
↑