You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:54:03