NestJS日志系统集成
如何在NestJS项目中集成日志系统?目前使用默认的Logger感觉功能有限,想实现以下需求:
- 日志分级(DEBUG/INFO/WARN/ERROR);
- 日志持久化存储到文件;
- 自定义日志格式(包含时间戳、请求ID等)。
- 尝试过winston但配置时遇到类型冲突问题,请问有没有成熟的集成方案?最好能分享具体配置示例和常见问题解决方案。
3 回复
在NestJS中集成日志系统非常简单。默认使用@nestjs/common
中的Logger
类,它功能强大且易于使用。如果你想要更高级的日志管理,可以集成第三方库如winston
或pino
。
首先安装winston
:
npm install winston
然后创建一个自定义日志服务来集成winston
:
import { Injectable } from '@nestjs/common';
import * as winston from 'winston';
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' }),
],
});
@Injectable()
export class CustomLoggerService {
log(message: string) {
logger.log('info', message);
}
error(message: string, trace: string) {
logger.error(message, trace);
}
warn(message: string) {
logger.warn(message);
}
debug?(message: string) {
logger.debug(message);
}
verbose?(message: string) {
logger.verbose(message);
}
}
在模块中注入并使用该服务:
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CustomLoggerService } from './custom-logger.service';
@Module({
controllers: [AppController],
providers: [AppService, CustomLoggerService],
})
export class AppModule {}
这样你就有了一个可扩展的日志系统,适合生产环境使用。
在NestJS中集成日志系统非常简单。默认情况下,NestJS 使用 pino 作为其日志系统,它轻量且高效。
首先确保你已安装了 NestJS 的核心依赖:
npm install @nestjs/common @nestjs/core
然后你可以直接使用 Logger
类进行日志记录:
import { Controller, Get } from '@nestjs/common';
import { Logger } from '@nestjs/common';
@Controller()
export class AppController {
private readonly logger = new Logger(AppController.name);
@Get()
getHello(): string {
this.logger.log('Log example');
this.logger.error('Error example');
this.logger.warn('Warn example');
return 'Hello World!';
}
}
如果你想自定义日志格式,可以创建一个自定义的 Logger 并覆盖默认行为:
import { Injectable, Scope } from '@nestjs/common';
import { Request } from 'express';
import * as pino from 'pino';
@Injectable({ scope: Scope.TRANSIENT })
export class CustomLoggerService {
private readonly logger: any;
constructor() {
this.logger = pino({
transport: {
target: 'pino-pretty',
},
});
}
log(message: any) {
this.logger.info(message);
}
error(message: any, trace: string) {
this.logger.error(message, trace);
}
warn(message: any) {
this.logger.warn(message);
}
debug?(message: any) {
this.logger.debug(message);
}
verbose?(message: any) {
this.logger.verbose(message);
}
}
最后,在你的模块文件中注入这个自定义的服务即可。