Nest.js 整合 Winston 日志系统的实战教程

初步集成

创建项目:

bash 复制代码
nest new nest-winston-test -p npm

进入目录将服务跑起来:

bash 复制代码
npm run start:dev

安装 winston:

bash 复制代码
npm install winston

创建 logger.service.ts:

typescript 复制代码
import { Injectable, LoggerService } from '@nestjs/common';
import * as winston from 'winston';

@Injectable()
export class WinstonLoggerService implements LoggerService {
  private readonly logger: winston.Logger;

  constructor() {
    this.logger = winston.createLogger({
      transports: [
        new winston.transports.Console(),
        // 根据需要添加更多的 transports
      ],
      format: winston.format.combine(
        winston.format.timestamp(),
        winston.format.printf(
          (info) => `${info.timestamp} ${info.level}: ${info.message}`,
        ),
      ),
    });
  }

  log(message: string) {
    this.logger.log('info', message);
  }

  error(message: string, trace: string) {
    this.logger.log('error', `${message} - ${trace}`);
  }

  warn(message: string) {
    this.logger.log('warn', message);
  }

  // 根据需要添加更多的日志级别方法
}

注册:

使用:

访问下 localhost:3000:

成功打印了日志。但是和 nest 内置的日志格式不一样。我们可以模仿下。

添加更多

安装 dayjs 格式化日期:

bash 复制代码
npm install dayjs

安装 chalk 来打印颜色:

bash 复制代码
npm install chalk@4

注意:这里用的是 chalk 4.x 的版本。

然后来实现下 nest 日志的格式:

typescript 复制代码
import { LoggerService } from '@nestjs/common';
import * as chalk from 'chalk';
import * as dayjs from 'dayjs';
import { createLogger, format, Logger, transports } from 'winston';

export class WinstonLoggerService implements LoggerService {
  private logger: Logger;

  constructor() {
    this.logger = createLogger({
      level: 'debug',
      transports: [
        new transports.Console({
          format: format.combine(
            format.colorize(),
            format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
            format.printf(({ context, level, message, time }) => {
              const appStr = chalk.green(`[NEST]`);
              const contextStr = chalk.yellow(`[${context}]`);

              return `${appStr} ${time} ${level} ${contextStr} ${message} `;
            }),
          ),
        }),
      ],
    });
  }

  getTime() {
    return dayjs(Date.now()).format('YYYY-MM-DD HH:mm:ss');
  }

  log(message: string, context: string) {
    this.logger.info(message, { context, time: this.getTime() });
  }

  error(message: string, context: string) {
    this.logger.error(message, { context, time: this.getTime() });
  }

  warn(message: string, context: string) {
    this.logger.warn(message, { context, time: this.getTime() });
  }
}

main.ts 替换 Nest.js 内置的 logger:

加下第二个上下文参数:

访问下页面:打印:

然后加一个 File 的 transport。

会生成日志文件:

封装成动态模块

我们可以将 winston 集成到 nest 中,社区也有对应的包:nest-winston,我们来自己封装下叭:

logger.service.ts:

然后在 AppModule 引入下:

改一下 main.ts 里用的 logger:

正常打印:

使用:

相关推荐
摇滚侠3 分钟前
《SpringBoot 3:入门与应用实战》第 9 章 使用 WebMvc 开发应用 阅读笔记 1
spring boot·笔记·后端
SoaringHeart4 分钟前
Flutter 进阶:NCanvasImageLoader 让 Canvas 也能画网络图
前端·flutter
用户8356290780515 分钟前
使用 Python 在 Excel 中插入 OLE 对象
后端·python
计算机魔术师20 分钟前
英伟达两个月叫停360亿美元生意:芯片巨头怕了反垄断?
前端
程序员小八77723 分钟前
Go 语言特性
开发语言·后端·golang
XuCoder29 分钟前
你以为隔离级别只是个开关,可 MySQL 凭什么靠它挡住幻读?
后端
创新技术阁29 分钟前
FastapiAdmin 前后端启动全流程详解
前端·后端·fastapi
七牛开发者35 分钟前
实测推荐 3 个 Skill,轻松上手 Codex 网页设计与交付流程
前端·javascript·后端
七牛开发者38 分钟前
拆解 dsh 系列:从源码和版本变化看 DeepSeek Harness 的设计取舍
前端·javascript·后端
谭光志1 小时前
如何从网站提取设计风格:DOM、计算样式与 DESIGN.md
前端·javascript·agent