Winston: ๋‹ค๋ฅธ ๋ ˆ์ด๋ธ”๋กœ ๋™์ผํ•œ ์ „์†ก ๊ณต์œ 

์— ๋งŒ๋“  2015๋…„ 10์›” 30์ผ  ยท  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๋‹˜ , ์•ˆ๋…•ํ•˜์„ธ์š”.

์ €๋Š” winston 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"}

๋กœ๊ทธ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— "label" ํ•„๋“œ๊ฐ€ ํฌํ•จ๋œ witch ๊ฐœ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ํ˜•์‹์˜ ๊ฒฝ์šฐ:

const imLogFormat = printf(์ •๋ณด => {
${info.timestamp} [${info.label}] ${info.level}: ${info.message} ๋ฐ˜ํ™˜ ;
});

๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

logger.error('๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค' + err, {label: "Class1"})
logger.error('๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค' + err, {label: "Class2"})

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰