如何在NestJS的app.module.ts中配置Winston适配双系统的日志路径
解决方案
步骤1:安装跨平台环境变量工具与Nest配置模块
首先安装所需依赖:
npm install @nestjs/config cross-env
cross-env用于解决Windows与Linux系统下环境变量设置语法不一致的问题,@nestjs/config是Nest官方提供的环境变量管理模块。
步骤2:修改package.json启动脚本
在scripts中添加环境变量标识:
{ "scripts": { "start:dev": "cross-env NODE_ENV=development nest start --watch", "start:prod": "NODE_ENV=production node dist/main" } }
Windows本地开发时会自动识别cross-env设置的NODE_ENV值,Linux生产环境可直接用系统原生环境变量设置方式
步骤3:修改app.module.ts配置Winston路径
将WinstonModule的静态注册改为异步注册,根据环境变量动态生成日志路径:
import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { EventEmitterModule } from '@nestjs/event-emitter'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { WinstonModule } from 'nest-winston'; import * as winston from 'winston'; @Module({ imports: [ // 全局注册配置模块 ConfigModule.forRoot({ isGlobal: true }), // 异步注册Winston WinstonModule.forRootAsync({ useFactory: (configService: ConfigService) => { const env = configService.get<string>('NODE_ENV', 'development'); // 生产环境日志路径,可通过.env文件自定义LOG_PATH覆盖默认值 const prodLogPath = configService.get<string>('LOG_PATH', '/var/logs/myservice'); // 动态拼接日志文件名 const getLogPath = (filename: string) => { return env === 'production' ? `${prodLogPath}/${filename}` : filename; }; return { level: 'info', format: winston.format.json(), defaultMeta: { service: 'trading-signal-listener' }, transports: [ new winston.transports.File({ filename: getLogPath('error.log'), level: 'error' }), new winston.transports.File({ filename: getLogPath('combined.log') }), ], }; }, inject: [ConfigService], }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
注意事项
- 生产环境部署前需要提前创建
/var/logs/myservice目录,并给Node进程运行用户授予读写权限,避免日志写入失败 - 如需自定义日志路径,可在项目根目录新建.env文件添加
LOG_PATH=你的自定义路径配置即可生效 - 不需要安装@nestjs/config的简化版本:可直接读取process.env.NODE_ENV判断环境,代码如下:
// 简化版直接判断,无需引入ConfigModule const env = process.env.NODE_ENV || 'development'; const getLogPath = (filename: string) => env === 'production' ? `/var/logs/myservice/${filename}` : filename;
内容的提问来源于stack exchange,提问作者feder
相关产品推荐
相关产品推荐

