Как я могу получить журнал Sails.js для использования нескольких транспортов Winston с разными уровнями журнала?

После поиска в документации Sails.js, проблемах GitHub, группе Google и здесь, в SO, я все еще не могу понять, что я делаю не так ...

Я хочу использовать Winston для ведения журнала с 3 разными транспортами на 3 разных уровнях журнала:

  • warn регистрируется в транспорте Sentry
  • info регистрируется в транспорте Loggly
  • verbose регистрируется в транспорте консоли.

В моем config/log.js файле есть следующее:

var Winston = require('winston');
var Loggly = require('winston-loggly');
var Sentry = require('winston-sentry');

module.exports.log = {

  // Without this the log level is prefixed to messages twice 
  // for some reason...
  prefixes: {}, 

  // Without this, Winston Sails seems to only send "info" 
  // logs to Winston (Sails' default log level)...
  level: 'verbose', 

  custom: new Winston.Logger({
    transports: [

      new Winston.transports.Sentry({
        level: 'warn',
        dsn: '{my account dsn}',
        patchGlobal: true
      }),

      new Winston.transports.Loggly({
        level: 'info',
        subdomain: '{my subdomain}',
        inoputToken: '{my input token}'
      }),

      new Winston.transports.Console({
        level: 'verbose'
      })

    ]
  })
};

Но с описанной выше настройкой возникает множество проблем:

  • verbose журналы отправляются в Loggly ...
  • В Sentry обнаруживаются только root ошибки, которые, я думаю, связаны с параметром patchGlobal. Никаких предупреждений и ошибок «Возможно неперехваченное исключение» из отклоненных обещаний Bluebird.

Может ли кто-нибудь указать мне правильное направление? Что я делаю неправильно?


person Adam    schedule 22.01.2015    source источник
comment
Предупреждаем: в var Loggly = require('winston-longly'): допущена двойная опечатка. Я думаю, это должно быть winston-loggly и заканчивать строку ;, верно?   -  person Murilo    schedule 18.09.2015
comment
Хороший улов @Murilo, исправлено.   -  person Adam    schedule 18.09.2015


Ответы (1)


Что ж, похоже, Уинстон записывает в журналы на основе их числовых уровней. Таким образом, сообщения об ошибках всегда будут записываться в информационный журнал, но никогда не будут записываться в журнал ошибок.

Поэтому я думаю, что лучше разделить на разные экземпляры в config / bootstrap.js:

sails.warnLog = new (winston.Logger)({
      transports: [
        new (winston.transports.Sentry)({
          name: 'warn-Sentry',
          dsn: '{my account dsn}',
          patchGlobal: true
          level: 'warn'
        })
      ]});

sails.infLog = new (winston.Logger)({
      transports: [
        new (winston.transports.Loggly)({
          name: 'info-Loggly',
          subdomain: '{my subdomain}',
          inputToken: '{my input token}'
          level: 'info'
        })
      ]});

sails.verbLog = new (winston.Logger)({
      transports: [
        new (winston.transports.Console)({
          name: 'verb-console',
          timestamp: true,
          prettyPrint: true,
          colorize: true,
          level: 'verbose'
        })
      ]});

А потом в лог можно писать:

sails.warnLog.warn('Warning');
sails.infLog.info('Information');
sails.verbLog.verbose('Verbose');

На самом деле мне это не нравится. Это некрасиво = (

person Bulkin    schedule 22.05.2015