MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como habilitar o log para Mongoose e o driver MongoDB Node.JS

A coleta de logs detalhados é uma etapa crítica ao depurar problemas relacionados à conexão com o MongoDB. Neste breve post, mostraremos como habilitar o log no driver MongoDB Node.JS e no Mongoose. Referimo-nos ao Mongoose versão 5.xeo driver versão 3.5 nesta discussão.

Registrando o driver MongoDB Node.JS

O mecanismo de registro para o driver nativo é bem explicado na documentação de registro. As características essenciais são:

  • Existem 3 níveis de log – debug , info , warn e error . O padrão é error . info é uma escolha decente ao tentar depurar problemas. debug permite rastreamento extremamente detalhado, portanto, use-o somente quando os logs forem gerados no info nível não são suficientes.
  • Por padrão, os logs vão para console.log()

Definindo o nível de log

No código

const MongoClient = require('mongodb').MongoClient;
const Logger = require('mongodb').Logger;
Logger.setLevel('info');

Ao definir o nível de log no código, você também pode adicionar filtros para classes específicas. Por exemplo.

Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things

Via opções


O logger e logLevel também pode ser passado através de opções de conexão, mostramos um exemplo na seção Mongoose.

Registro para Mongoose


Habilitar o registro de nível de depuração para o Mongoose é simples:
mongoose.set('debug', true)

No entanto, isso só permite o registro de operações do MongoDB, como consultas e atualizações. Se você deseja depurar problemas relacionados à conexão, pool de conexões, etc., isso não ajuda em nada.

Por outro lado, como o Mongoose utiliza o driver MongoDB Node.JS abaixo, se habilitarmos o log para o driver, também poderemos obter logs do driver. A maneira mais fácil de fazer isso é passar as opções relacionadas ao log. Por exemplo.

// logging options for the driver
var options = {
    logger: console.log,
    loggerLevel: 'info',
    poolSize: 10
}

var uri = 'mongodb://user:pass@localhost:port,anotherhost:port,yetanother:port/mydatabase';
// with options
mongoose.connect(uri, options);

Exceto as opções específicas do Mongoose, o Mongoose passa todas as outras opções para o driver. A documentação do driver explica as seguintes opções:

  • loggerLevel – string – opcional – O nível de registro (erro/aviso/info/depuração)
  • logger – objeto – opcional – objeto logger personalizado

No exemplo acima, passamos o loggerLevel como info e o logger como console.log .
Como habilitar o log para Mongoose e o driver MongoDB Node.JSClique para Tweet

Registro personalizado

Mesmo que a documentação do driver forneça um exemplo sobre como escrever registradores personalizados, não é muito útil. Normalmente, tentaríamos enviar esses logs para um arquivo diferente, longe dos logs padrão do aplicativo, e podemos usar a funcionalidade de logger personalizado para fazer isso.

Se você observar o código-fonte de log do driver, o seguinte ficará claro:

  • O registrador padrão é oconsole.log
  • O registrador deve ser uma função
  • A função do registrador leva dois argumentos:
    • A string da mensagem no formato a seguir:
      [LEVEL-className:pid] timestamp logMsg

      Por exemplo:
      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Um objeto de estado que contém as seguintes informações:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Por exemplo:
      {
         type: 'info',
        message:
         'server sg-rs-91.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}',
         className: 'Server',
         pid: 9224,
         date: 1589439590772
      }
      

Então, para escrever um registrador personalizado, você pode simplesmente escrever uma função para usar uma estrutura de registro de sua escolha para registrar essas mensagens no formato que desejar.

Aqui está um registrador Bunyan bastante primitivo configurado como um registrador personalizado:

var Logger = require('bunyan');
var log = Logger.createLogger({
  name: "MongoDB Driver",
  streams: [
  {
    stream: process.stdout,
    level: 'info'
  },
  {
      stream: process.stdout,
      level: 'debug'
  },
  {
      stream: process.stderr,
      level: 'error'
  }
  ],
});
 
function mongoLogger(msg, state) {
  // console.log(msg, state);
 
  switch (state.type) {
    case 'debug':
      log.debug(state);
      break;
    case 'info':
      log.info(state);
      break;
    case 'warn':
      log.warn(state);
    case 'error':
    default:
      log.error(state);
  }
}

Em seguida, passe-o em suas opções:

var options = {
  logger: mongoLogger,
  loggerLevel : 'info'
}

A saída do console.log será:

[INFO-Server:9413] 1589442507330 server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {"name":"MongoNetworkError","message":"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017","stack":"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\n	at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"} { type: 'info',
  message:
   'server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {"name":"MongoNetworkError","message":"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017","stack":"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\\n	at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"}',
  className: 'Server',
  pid: 9413,
  date: 1589442507330 }

A saída do Bunyan será:

{"name":"MongoDB Driver","hostname":"<hostname>","pid":9413,"level":30,"type":"info","message":"server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {\"name\":\"MongoNetworkError\",\"message\":\"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\",\"stack\":\"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\\n	at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)\"}","className":"Server","date":1589442507330,"msg":"","time":"2020-05-14T07:48:27.331Z","v":0}

Você poderá usar todos os recursos do Bunyan para lidar com os logs como achar melhor, por exemplo. enviando-os para um arquivo rotativo, separando mensagens de erro e informações etc.

Esperamos que este guia sobre como habilitar o log no driver MongoDB Node.JS e no Mongoose tenha sido útil para você em sua configuração. Sinta-se à vontade para deixar um comentário na seção de comentários abaixo se tiver alguma dúvida ou precisar de ajuda.