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 的持久元数据?