nestJS + winston 实现日志记录到文件功能

440 阅读1分钟

目的

主要是想将日志不仅仅是在控制台输出,也要输出到一个文件里,方便上线后的查看

步骤

安装

我们这边主要使用了 nest-winston

npm install nest-winston winston --save

配置 app.module.ts

import { utilities as nestWinstonModuleUtilities, WinstonModule } from 'nest-winston';
import * as winston from 'winston';

const customTimestamp = () => {
  return new Date().toLocaleString('zh-CN', {
    timeZone: 'Asia/Shanghai', // 指定时区
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    hour12: false,
  });
};

@Module({
    imports: [
        WinstonModule.forRoot({
            level: 'info', // 仅当 info.level 小于或等于此级别时才记录
            format: winston.format.combine(
                winston.format.timestamp({ format: customTimestamp }),
                winston.format.ms(),
                // 为错误日志添加堆栈信息。这对于调试和错误追踪非常有用:
                winston.format.errors({ stack: true }),
                winston.format.json(),
            ),
            transports: [
                new winston.transports.Console({
                  format: winston.format.combine(
                    winston.format.timestamp(),
                    winston.format.ms(),
                    nestWinstonModuleUtilities.format.nestLike('MyApp', {
                      colors: true,
                      prettyPrint: true,
                      processId: true,
                      appName: true,
                    }),
                  ),
                }),
                new winston.transports.File({
                  filename: 'combined.log', // 日志文件的名称
                  dirname: 'logs', // 日志文件存储的目录(相对于项目根目录或绝对路径)
                }),
                // warn
                new winston.transports.File({
                  filename: 'warn.log',
                  dirname: 'logs',
                  level: 'warn', // 日志级别
                }),
                // error
                new winston.transports.File({
                  filename: 'error.log',
                  dirname: 'logs',
                  level: 'error',
                }),
              ],
          });
    ]

})

new winston.transports.Console 配置控制台上的打印信息

new winston.transports.File 配置生成文件的打印信息

如何使用

上面已经配置完成,那么如何使用?

xxx.controller.ts

import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
import { Logger } from 'winston';

@Controller('xxx')
export class XxxController {
    constructor(
        @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger
    ){}
    
    @Get('abc')
    async getAbc(@Query params: any, @Req req: Request) {
        this.logger.info('测试');
    }
}