Winston: рдПрдХ рд╣реА рдкрд░рд┐рд╡рд╣рди рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд▓реЗрдмрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЕрдХреНрддреВре░ 2015  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: winstonjs/winston

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рд╕рднреА рд▓реЙрдЧ рдореЗрдВ рдПрдХ рдЙрдкрд╕рд░реНрдЧ рд╣реЛ рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реЛ рдХрд┐ рд▓реЙрдЧ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХрдИ рдкрд░рд┐рд╡рд╣рди рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рд╣реИ

var config = require('config')
var winston = require('winston')

var loggers = {}


function getLogger(moduleName) {
  if (!loggers[moduleName]) {
    loggers[moduleName] = createNewLogger(moduleName)
  }

  return loggers[moduleName]
}

function createNewLogger(moduleName) {
  var logger = new winston.Logger()

  //https://github.com/winstonjs/winston/blob/master/docs/transports.md#console-transport
  logger.add(winston.transports.Console,
    {
      colorize: true,
      timestamp: true,
      label: moduleName,
      level: config.get('log.level')
    }
  )

  logger.add(winston.transports.DailyRotateFile,
    {
      filename: config.get('log.filename'),
      level: config.get('log.level')
    }
  )

  return logger
}

module.exports = getLogger

рдореИрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╕рднреА рд▓реЙрдЧ рдПрдХ рдлрд╝рд╛рдЗрд▓/рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рдеред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: https://github.com/winstonjs/winston#working -with-multiple-loggers-in-winston

рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рдерд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд▓рдХрдбрд╝рд╣рд╛рд░реЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рд╡рд╣рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб:

function getLogger(moduleName) {
  console.log('Initializing logger for: ' + moduleName)
  winston.loggers.add(moduleName, {
    //https://github.com/winstonjs/winston/blob/master/docs/transports.md#console-transport
    Console: {
      colorize: true,
      timestamp: true,
      label: moduleName,
      level: config.get('log.level')
    },
    DailyRotateFile: {
      filename: config.get('log.filename'),
      level: config.get('log.level')
    }
  })

  return winston.loggers.get(moduleName)

}

Error: Transport already attached: console . рджреЗрдВрдЧреЗ

рдореИрдВ рдЧрд▓рдд рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ?

рдЕрд░реЗ @indexzero ,

рдореИрдВ рд╡рд┐рдВрд╕реНрдЯрди 3.0.0 рдкрд░ рд╣реВрдВред

рдореИрдВрдиреЗ рдпрд╣ рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЕрдирд┐рд╢реНрдЪрд┐рдд рдЕрдЧрд░ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ; рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧ рд╕рдВрджреЗрд╢ рдХреЛ рдЙрдкрд╕рд░реНрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдпрд╛ рдореЙрдбреНрдпреВрд▓/рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реАрд▓реНрдб рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ (рдХреБрдЫ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП)ред рдпрд╣ рдХреЛрдб рд╣реИ ( рдбреЙрдХреНрд╕ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЬрд╛ рд░рд╣рд╛ рд╣реИ ):

const loggers = {};
module.exports.getModuleLogger = (moduleName, methodName) => {
    const categoryName = [moduleName, methodName].join(':');
    if (!loggers[categoryName]) {
      loggers[categoryName] = winston.loggers.add(categoryName, {
        console: {
          label: categoryName,
        },
        file: {
          filename: './log/test.log',
          label: categoryName,
        },
      });
    }
    return winston.loggers.get(categoryName);
  };

рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓рддреА рд╣реИ:

[winston] Attempt to write logs with no transports {"message":"yolo","
level":"info"}

рдЖрдк рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдЪ рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд▓реЙрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдлрд╝реАрд▓реНрдб "рд▓реЗрдмрд▓" рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЙрджрд╛рд╣рд░рдг:
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП:

рдХрд╛рд╕реНрдЯ imLogFormat = рдкреНрд░рд┐рдВрдЯрдл (рдЬрд╛рдирдХрд╛рд░реА => {
рд╡рд╛рдкрд╕реА ${info.timestamp} [${info.label}] ${info.level}: ${info.message} ;
});

рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

logger.error('рдореЗрд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реИ' + рддреНрд░реБрдЯрд┐, {рд▓реЗрдмрд▓: "рдХрдХреНрд╖рд╛ 1"})
logger.error('рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реИ' + рддреНрд░реБрдЯрд┐, {рд▓реЗрдмрд▓: "рдХрдХреНрд╖рд╛ 2"})

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

Buzut picture Buzut  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pocesar picture pocesar  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mohanen picture mohanen  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mrgoos picture mrgoos  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bertolo1988 picture bertolo1988  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ