15

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

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

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

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

Есть идеи?

  • Error: User Rate Limit Exceeded

    от
  • 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

  • 7

    Я только что отправил запрос на удаление

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

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

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

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

  • 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
    

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