返回

NestJS 存储日志的轻松入门

后端

NestJS 中使用 Winston 进行文件日志记录

在现代复杂的 Node.js 应用程序中,日志记录至关重要,因为它可以让我们深入了解应用程序的运行状况、错误和事件。NestJS 提供了出色的日志记录功能,而 Winston 是一个流行的第三方日志记录库,这两者结合起来可以轻松实现日志记录。

为什么使用 Winston 保存日志到文件?

将日志记录到文件的好处多多:

  • 持久性: 日志文件可以长期保存,即使应用程序关闭,也不会丢失信息。
  • 可追溯性: 文件日志可以让我们轻松追溯问题和事件的根源,有助于调试和故障排除。
  • 集中存储: 日志文件集中存储在特定位置,便于访问和分析。

配置 Winston

要将 Winston 集成到 NestJS 项目中,请执行以下步骤:

  1. 安装 Winston: 运行 npm install winston 来安装 Winston 库。
  2. 创建日志文件: 在项目目录中创建一个名为 logs 的文件夹,用于存储日志文件。
  3. 配置 Winston: 创建一个名为 winston.config.ts 的配置文件,内容如下:
import { transports, createLogger } from 'winston';
import { join } from 'path';

const logDir = 'logs';

const logger = createLogger({
  transports: [
    new transports.Console({
      format: transports.format.combine(
        transports.format.timestamp(),
        transports.format.ms(),
        transports.format.json()
      )
    }),
    new transports.File({
      filename: join(logDir, 'error.log'),
      level: 'error',
      format: transports.format.combine(
        transports.format.timestamp(),
        transports.format.ms(),
        transports.format.json()
      )
    }),
    new transports.File({
      filename: join(logDir, 'combined.log'),
      format: transports.format.combine(
        transports.format.timestamp(),
        transports.format.ms(),
        transports.format.json()
      )
    })
  ]
});
  1. 使用 Winston 记录日志: 在 NestJS 控制器中,可以使用 Winston 记录日志:
import { Injectable, Logger } from '@nestjs/common';
import { createLogger } from 'winston';
import { utilities } from 'nest-winston';

@Injectable()
export class AppService {
  private logger = createLogger(utilities.formatWinstonParams(WinstonModule.createLoggerOptions()));

  getData(): string {
    this.logger.info('Fetching data...');
    return 'Hello World!';
  }
}

常见问题解答

  1. 如何指定日志级别?
    在 Winston 配置文件中,可以为每个传输指定日志级别,例如 errorinfo

  2. 如何旋转日志文件?
    可以使用 Winston 的 dailyRotate 传输旋转日志文件,例如:

new transports.DailyRotateFile({
  filename: join(logDir, 'combined.log'),
  maxFiles: '14d'
})
  1. 如何将日志传输到其他目的地?
    Winston 支持多种传输,包括电子邮件、Syslog 和 HTTP 请求。

  2. 如何配置日志格式?
    可以使用 Winston 的 format 函数自定义日志消息的格式,例如:

format: transports.format.combine(
  transports.format.timestamp(),
  transports.format.json(),
  transports.format.prettyPrint()
)
  1. 如何禁用控制台日志输出?
    在 Winston 配置文件中,可以禁用控制台传输:
transports: [
  new transports.File({
    filename: join(logDir, 'combined.log'),
    format: transports.format.json()
  })
]

结论

将 Winston 集成到 NestJS 项目中可以轻松地将日志记录到文件中。通过这样做,我们获得了持久性、可追溯性和集中存储等优势,这对于维护应用程序的稳定性、快速定位和解决问题至关重要。