Winston: Compartilhando o mesmo transporte com rótulos diferentes

Criado em 30 out. 2015  ·  4Comentários  ·  Fonte: winstonjs/winston

Eu gostaria que todos os meus logs tivessem um prefixo representando de onde veio o log. Desta forma cria vários transportes para o mesmo arquivo, o que obviamente é um

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

Basicamente, quero todos os meus logs em um único arquivo/console, mas com um prefixo diferente. Alguma ideia?

Todos 4 comentários

Eu acredito que você quer isso: https://github.com/winstonjs/winston#working -with-multiple-loggers-in-winston

Obrigado por isso! Eu já vi isso antes, mas fiquei com a impressão de que os transportes estavam sendo recriados para cada madeireiro.

Por exemplo o seguinte código:

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)

}

Vai dar Error: Transport already attached: console

O que estou fazendo de errado?

Oi @indexzero ,

Estou em winston 3.0.0 .

Eu tentei isso também, sem saber se este é o caminho certo; basicamente, quero uma maneira mais fácil de prefixar cada mensagem de log ou anexar um campo padrão para cada log com base no módulo / função do qual está sendo registrado (para alguma estrutura). Este é o código ( seguindo o exemplo nos documentos ):

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);
  };

Mas recebo o seguinte aviso:

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

você pode conseguir isso adicionando um objeto que contém o campo "label" nos parâmetros de sua função de log, exemplo:
para o seguinte formato:

const imLogFormat = printf(info => {
retorna ${info.timestamp} [${info.label}] ${info.level}: ${info.message} ;
});

você pode fazer o seguinte:

logger.error('Eu tenho o seguinte erro' + err, {label: "Class1"})
logger.error('Eu tenho o seguinte erro' + err, {label: "Class2"})

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

mrgoos picture mrgoos  ·  4Comentários

JaehyunLee-B2LiNK picture JaehyunLee-B2LiNK  ·  3Comentários

xungwoo picture xungwoo  ·  3Comentários

pocesar picture pocesar  ·  3Comentários

anks333 picture anks333  ·  3Comentários