NestJS 使用默认记录器或 npm(如 winston)登录文件、数据库等
Posted
技术标签:
【中文标题】NestJS 使用默认记录器或 npm(如 winston)登录文件、数据库等【英文标题】:NestJS Logging into File, Database, etc using either default logger or npm like winston 【发布时间】:2020-01-27 00:35:28 【问题描述】:NestJS 使用默认记录器实现。它将输出发送到控制台。
请问,如何配置默认记录器以将输出发送到文件、数据库。
另外,
如果我想在 NestJS 中使用 Winston,如何使用/注入/扩展各种传输选项。
它不应该与 NestJS 紧密耦合,并且总是可以替换为其他一些记录器。
【问题讨论】:
【参考方案1】:您不能将默认记录器配置为将输出发送到其他地方。 您需要创建自定义记录器或更好:扩展默认记录器以实现您的需求。
import Logger from '@nestjs/common';
export class MyLogger extends Logger
error(message: string, trace: string)
// write the message to a file, send it to the database or do anything
super.error(message, trace);
阅读the documentation 了解如何实现。
但是,如果您无论如何都想使用 Winston,则无需重新发明***,您可以使用很棒的 npm 包nest-winston。
首先你需要在你的app.module.ts
注册WinstonModule
import Module from '@nestjs/common';
import WinstonModule from 'nest-winston';
import * as winston from 'winston';
[...]
@Module(
imports: [
TypeOrmModule.forRoot(typeOrmConfig),
WinstonModule.forRoot(
transports: [
new winston.transports.Console(),
],
),
SearchesModule,
SuggestionsModule,
],
)
export class AppModule
然后你可以像这样在任何地方注入和使用记录器:
import Injectable, Inject from '@nestjs/common';
import InjectRepository from '@nestjs/typeorm';
import Logger from 'winston';
import SuggestionsRepository from './suggestions.repository';
@Injectable()
export class SuggestionsService
constructor(
@InjectRepository(SuggestionsRepository)
private repository: SuggestionsRepository,
@Inject('winston')
private readonly logger: Logger,
)
getAllSuggestions = async () =>
this.logger.info('Returning suggestions...');
return await this.repository.getAll();
阅读documentation 了解更多示例。
【讨论】:
感谢您提供非常清晰的答案和实施示例!很有帮助。 这很酷,但作为一种解决方案,它会使代码变得混乱,不得不将其注入到您打算使用它的所有构造函数中——以及调用它。需要大量重构所有现有代码。 @SebastianG 有什么解决方案?【参考方案2】:在 Linux 中,您可以简单地将标准输出通过管道传输到文件: npm run start > app.log
在 Powershell 中,您可以使用 Out-File 可能像这样(虽然不是powershell专家) npm 运行开始 | Out-File -filepath app.log
因此,记录器库还支持在您的应用代码中直接处理文件输出。
【讨论】:
如果你这样做,你将如何每天轮换文件?【参考方案3】:这里是如何在文件中实现日志记录结果
WinstonModule.forRoot(
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json(),
),
transports: [
new winston.transports.Console(),
new winston.transports.File(
dirname: path.join(__dirname, './../log/debug/'), //path to where save loggin result
filename: 'debug.log', //name of file where will be saved logging result
level: 'debug',
),
new winston.transports.File(
dirname: path.join(__dirname, './../log/info/'),
filename: 'info.log',
level: 'info',
),
],
),
【讨论】:
以上是关于NestJS 使用默认记录器或 npm(如 winston)登录文件、数据库等的主要内容,如果未能解决你的问题,请参考以下文章