20

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

但是,以天真的方式这样做是行不通的:添加多个winston.transports.File传输会产生错误。

其他人遇到了这个问题,给出了模糊的解决方案提示,但没有真正的答案

有任何想法吗?

4

5 回答 5

21

不幸的是,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

也许不优雅,但至少它有效。

于 2013-06-28T23:12:26.763 回答
11

同时,您可以使用相同的接口实现一个基本的包装器,如下所示

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。可以扩展元数据等等......

于 2014-06-09T16:35:13.900 回答
9

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

它已经合并到 flatiron/winston 中。

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

于 2012-06-29T12:50:33.133 回答
5

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

于 2016-07-28T08:32:35.057 回答
4

Winston 现在正式支持此功能,并在此处的自述文件中进行了说明

代码示例:

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  defaultMeta: { service: 'user-service' },
  transports: [
    //
    // - Write to all logs with level `info` and below to `combined.log` 
    // - Write all logs error (and below) to `error.log`.
    //
    new winston.transports.File({ filename: 'error.log', level: 'error' }),
    new winston.transports.File({ filename: 'combined.log' })
  ]
});

//
// If we're not in production then log to the `console` with the format:
// `${info.level}: ${info.message} JSON.stringify({ ...rest }) `
// 
if (process.env.NODE_ENV !== 'production') {
  logger.add(new winston.transports.Console({
    format: winston.format.simple()
  }));
}
于 2019-06-28T07:58:07.637 回答