Winston的多个日志文件?

我们想用Winston来loggingNode.js. 但是,我们无法弄清楚如何拥有两个日志文件:一个用于错误,另一个用于其他所有文件。

但是,这样做的方式并不起作用:添加多个winston.transports.File传输给出错误。

其他人已经遇到了这个问题,含糊其辞的解决scheme,但没有真正的答案 。

有任何想法吗?

我刚刚发送了一个拉请求,允许在一个logging器中使用多个文件传输。 https://github.com/flatiron/winston/pull/149

它已经合并成熨斗/温斯顿。

你也可以使用我的分叉回购: https : //github.com/pdobrev/winston

不幸的是,pesho提到的补丁似乎还没有包含在正式版本中(参见stephenbeeson在pull request#149中的评论)。

所以,我使用了一个解决方法。 由于winston比较了名称的属性,你可以通过自己定义名字来欺骗它:

 winston = require 'winston' logger = new winston.Logger transports: [ new winston.transports.File name: 'file#debug' level: 'debug' filename: '/tmp/debug.log' new winston.transports.File name: 'file#error' level: 'error' filename: '/tmp/error.log' ] logger.error 'error' # both logs logger.debug 'debug' # on debug log 

也许不够优雅,但至less可以工作。

同时,你可以像这样使用相同的接口来实现一个基本的包装器

 var winston = require('winston'); var configs = require('./env.js'); var debug = new winston.Logger({ levels: { debug: 0 }, transports: [ new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'debug'}), new (winston.transports.Console)({level: 'debug'}) ] }); var info = new winston.Logger({ levels: { info: 1 }, transports: [ new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'info'}), new (winston.transports.Console)({level: 'info'}) ] }); var warn = new winston.Logger({ levels: { warn: 2 }, transports: [ new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'warn'}), new (winston.transports.Console)({level: 'warn'}) ] }); var error = new winston.Logger({ levels: { error: 3 }, transports: [ new (winston.transports.File)({ filename: configs.PATH_TO_LOG, level: 'error'}), new (winston.transports.Console)({level: 'error'}) ] }); var exports = { debug: function(msg){ debug.debug(msg); }, info: function(msg){ info.info(msg); }, warn: function(msg){ warn.warn(msg); }, error: function(msg){ error.error(msg); }, log: function(level,msg){ var lvl = exports[level]; lvl(msg); } }; module.exports = exports; 

这将涵盖基本的Winston API。 可以扩展为元数据等等…

你只需要给运输一个自定义的name属性,所以你没有碰撞:

 const logger = new (winston.Logger)({ transports: [ new (winston.transports.Console)(), new (winston.transports.File)({ name: 'text', filename: logFile, json: false }), new (winston.transports.File)({ name: 'json', filename: logFileJson }) ] }); 

您可以在文档中阅读关于多个传输的更多信息: https : //github.com/winstonjs/winston#multiple-transports-of-the-same-type