Winston/Node.js 如何只为特定环境添加传输?

Posted

技术标签:

【中文标题】Winston/Node.js 如何只为特定环境添加传输?【英文标题】:Winston/Node.js how add a Transport only for certain environment? 【发布时间】:2016-08-07 02:17:57 【问题描述】:

我有以下配置:

var winston = require('winston');
var Mail = require('winston-mail').Mail;

var logger = new (winston.Logger)(
  transports: [
    new (winston.transports.Console)( level: 'info', colorize: true ),
    new (winston.transports.File)( level: 'info', filename: './logs/logs.log',
    new (Mail)(
              to: 'xxxxxx@xxxxxx.xx',
              from: 'winston@xxxxx.xx',
              subject: 'Errors occurred',
              level: 'error',
              host: 'smtp.xxxxx.xx',
              username: 'xxxx@xxxx.xx', 
              password: 'xxxxx',
              port: xxx
            )
  ],
  exceptionHandlers: [
    new (winston.transports.Console)(),
    new (winston.transports.File)( filename: './logs/exceptions.log' ),
    new (Mail)(
              to: 'xxxxxx@xxxxxx.xx',
              from: 'winston@xxxxx.xx',
              subject: 'Errors occurred',
              level: 'error',
              host: 'smtp.xxxxx.xx',
              username: 'xxxx@xxxx.xx', 
              password: 'xxxxx',
              port: xxx
            )
 ]
);

我只想为生产环境添加邮件传输,而不是在暂存或开发中。

我设置了不同的日志级别如下:

if (process.env.NODE_ENV === 'development') 
  logger.transports.console.level = 'debug';
  logger.transports.file.level = 'debug';

交通也有办法做到这一点?

【问题讨论】:

【参考方案1】:

transports 配置只是一个普通的旧 Array。所以我们可以使用所有常用的技巧。在这种情况下,您需要一个条件 push()

const winston = require('winston');
const transports = [
    new winston.transports.Console(
        level    : 'info',
        colorize : true
    ),
    new winston.transports.File(
        level    : 'info',
        filename : './logs/logs.log'
    )
];

if (process.env.NODE_ENV === 'production') 
    const Mail = require('winston-mail').Mail;

    transports.push(new Mail(
        to       : 'xxxxxx@xxxxxx.xx',
        from     : 'winston@xxxxx.xx',
        subject  : 'Errors occurred',
        level    : 'error',
        host     : 'smtp.xxxxx.xx',
        username : 'xxxx@xxxx.xx', 
        password : 'xxxxx',
        port     : 1234
    ));


const logger = new winston.Logger(
    transports
);

在填写邮件配置占位符后,此代码应该可以在 Node.js >= 4 上使用。

同样的原则也适用于exceptionHandlers

【讨论】:

从 winston 3.0 开始,您现在可以在已实例化的记录器上调用 logger.add(new winston.transports.Console(...))

以上是关于Winston/Node.js 如何只为特定环境添加传输?的主要内容,如果未能解决你的问题,请参考以下文章

如何在表格的特定位置添加一列? [复制]

有没有办法只为特定作业跳过 Spring Batch 的持久元数据?

如何在特定小时的滚动平均值的熊猫数据框中添加一列

在jsp中使用jtable为所有表添加分页

只为绘制的特定区域边界获取 UIImage - PaintView

Apple Watch 扩展只为特定用户安装