Skip to content

Nest 使用 Winston 日志

安装

bash
pnpm install --save nest-winston winston

pnpm install winston-daily-rotate-file

获取真实 IP

bash
pnpm install request-ip -S

全局使用

  • main.ts 中使用绑定到请求信息中 ip 字段
bash
import * as requestIp from "request-ip";
// 获取真实 ip 存储到用户请求信息中得IP字段
app.use(requestIp.mw({ attributeName: "ip" }));

创建一个日志动态模块

  • global.winston.module.ts

  • 设置成了全局模块,所以其他模块都可以使用

ts
import { DynamicModule, Global, Module } from "@nestjs/common";
import { WinstonModule, utilities } from "nest-winston";
import * as winston from "winston";
import "winston-daily-rotate-file";
@Global()
@Module({})
export class GlobalWinstonModule {
  static forRoot(): DynamicModule {
    return {
      module: GlobalWinstonModule,
      imports: [
        // 其他 模块 LoginModule,
        WinstonModule.forRoot({
          transports: [
            new winston.transports.Console({
              level: "info",
              format: winston.format.combine(
                winston.format.timestamp(),
                utilities.format.nestLike()
              ),
            }),
            new winston.transports.DailyRotateFile({
              level: "error",
              dirname: process.env.APP_LOG,
              filename: "error-%DATE%.log",
              datePattern: "YYYY-MM-DD",
              zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。
              maxSize: "10m",
              maxFiles: "14d",
              format: winston.format.combine(
                winston.format.timestamp(),
                winston.format.json()
              ),
            }),
            new winston.transports.DailyRotateFile({
              level: "info",
              dirname: process.env.APP_LOG,
              filename: "info-%DATE%.log",
              datePattern: "YYYY-MM-DD",
              zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。
              maxSize: "10m", // 设置日志文件的最大大小,m 表示 mb 。
              maxFiles: "14d", // 保留日志文件的最大天数,此处表示自动删除超过 14 天的日志文件。
              // 记录时添加时间戳信息
              format: winston.format.combine(
                winston.format.timestamp(),
                winston.format.json()
              ),
            }),
          ],
        }),
      ],
      controllers: [],
      providers: [],
      exports: [],
    };
  }
}
  • app.module.ts 引入动态模块
ts
import { GlobalWinstonModule } from "./common/global.winston.module";
import { Module } from "@nestjs/common";
import configuration from "./config/index";
import { ConfigModule } from "@nestjs/config";

@Module({
  imports: [GlobalWinstonModule.forRoot()],
  controllers: [],
  providers: [],
})
export class AppModule {}