温斯顿多个日志文件?(Multiple log files with Winston?)

2019-06-23 10:46发布

我们想用温斯顿我们在Node.js的日志 但是,我们无法弄清楚如何有两个日志文件:一个用于刚错误,一个是一切。

这样做可以用简单的方式不工作然而,:添加多个winston.transports.File传输提供了一个错误。

其他人遇到这个问题,一个解决方案的模糊线索,但没有真正的答案 。

有任何想法吗?

Answer 1:

我刚刚给拉入请求,允许使用多个文件传输的一个记录器。 https://github.com/flatiron/winston/pull/149

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

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



Answer 2:

不幸的是,pesho提到的补丁似乎仍然没有被纳入正式版(见stephenbeeson的评论pull请求#149 )。

所以,我用一种变通方法来代替。 温斯顿比较名称属性,你可以自己定义的名字骗它:

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

也许不是优雅,但至少它的工作原理。



Answer 3:

在此期间,您可以使用像这样同一个接口实现一个基本的包装

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;

这将包括基本的温斯顿API。 可扩展元数据等等...



Answer 4:

你只需要给运输自定义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



文章来源: Multiple log files with Winston?