Вопрос по node.js – Несколько журналов с Winston?

15

Мы хотели бы использовать Winston для нашего входа в Node.js. Но мы не можем понять, как получить два файла журнала: один только для ошибок, а другой для всего остального.

Однако наивный способ не работает: добавление несколькихwinston.transports.File транспорт дает ошибку.

Другие столкнулись с этой проблемой, со смутными намеками на решение, но без реального ответа.

Есть идеи?

Ваш Ответ

4   ответа
10

вы можете реализовать элементарную оболочку, используя тот же интерфейс, что и так

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. может быть расширен для метаданных и так далее ...

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

Error: User Rate Limit Exceeded
7

который позволяет использовать несколько транспортов файлов в одном логгере. https://github.com/flatiron/winston/pull/149

Это уже слито в flatiron / winston.

Вы также можете использовать мое раздвоенное репо: https://github.com/pdobrev/winston

18

исправление, о котором упоминал pesho, по-видимому, до сих пор не включено в официальную версию (см. Комментарий Стивенбисона взапрос на выдачу № 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

Может быть, не элегантно, но по крайней мере это работает.

Похожие вопросы