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)登录文件、数据库等的主要内容,如果未能解决你的问题,请参考以下文章

未找到连接“默认”-TypeORM、NestJS 和外部 NPM 包

nrwl/nx 如何使用 npm 发布 NestJs 库?

nestjs使用Typeorm实现数据库CRUD操作

Vue 学习记录

NestJS 不会在任何地方打印日志消息

nestjs中生成uuid