sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo habilitar el registro para Mongoose y el controlador MongoDB Node.JS

La recopilación de registros detallados es un paso crítico al depurar problemas relacionados con la conexión con MongoDB. En esta breve publicación, mostraremos cómo habilitar el inicio de sesión en el controlador MongoDB Node.JS y Mongoose. Nos referimos a la versión 5.x de Mongoose y la versión 3.5 del controlador en esta discusión.

Registro del controlador MongoDB Node.JS

El mecanismo de registro para el controlador nativo se explica bien en la documentación de registro. Las características esenciales son:

  • Hay 3 niveles de registro:debug , info , warn y error . El valor predeterminado es error . info es una opción decente cuando se intenta depurar problemas. debug permite un seguimiento extremadamente detallado, así que utilícelo solo cuando los registros generados en el info nivel no son suficientes.
  • Por defecto, los registros van a console.log()

Configuración del nivel de registro

En código

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

Al establecer el nivel de registro en el código, también puede agregar filtros para clases específicas. Por ejemplo

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

A través de opciones

El logger y logLevel también se puede pasar por opciones de conexión, te mostramos un ejemplo en la sección Mongoose.

Inicio de sesión para Mongoose

Habilitar el registro de nivel de depuración para Mongoose es simple:

mongoose.set('debug', true)

Sin embargo, esto solo permite el registro de operaciones de MongoDB como consultas y actualizaciones. Si está buscando depurar problemas relacionados con la conexión, el grupo de conexiones, etc., entonces esto no es de ayuda.

Por otro lado, dado que Mongoose utiliza el controlador MongoDB Node.JS debajo, si habilitamos el registro para el controlador, también podremos obtener registros del controlador. La forma más fácil de hacer esto es pasar las opciones relacionadas con el registro. Por ejemplo

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

Excepto las opciones específicas de Mongoose, Mongoose pasa todas las demás opciones al controlador. La documentación del controlador explica las siguientes opciones:

  • loggerLevel – cadena – opcional – El nivel de registro (error/advertencia/info/depuración)
  • logger – objeto – opcional – Objeto registrador personalizado

En el ejemplo anterior, pasamos el loggerLevel como info y el logger como console.log .

Cómo habilitar el registro para Mongoose y el controlador MongoDB Node.JSClick To Tweet

Registrador personalizado

Aunque la documentación del controlador brinda un ejemplo sobre cómo escribir registradores personalizados, no es muy útil. Por lo general, intentaríamos enviar estos registros a un archivo diferente, lejos de los registros de la aplicación estándar y podemos usar la función de registro personalizado para poder hacerlo.

Si observa el código fuente de registro del controlador, queda claro lo siguiente:

  • El registrador predeterminado es console.log
  • El registrador debe ser una función
  • La función de registro tarda dos argumentos:
    • La cadena del mensaje en el siguiente formato:
      [LEVEL-className:pid] timestamp logMsg

      Por ejemplo:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Un objeto de estado que contiene la siguiente información:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Por ejemplo:

      {
         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
      }
      

Entonces, para escribir un registrador personalizado, simplemente puede escribir una función para usar un marco de registro de su elección para registrar estos mensajes en el formato que desee.

Aquí hay un registrador Bunyan bastante primitivo configurado como un 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);
  }
}

Luego pásalo en tus opciones:

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

La salida de console.log será entonces:

[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 }

La salida de 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}

Entonces podrá usar todas las funciones de Bunyan para manejar los registros como mejor le parezca, p. enviándolos a un archivo giratorio, separando los mensajes de error e información, etc.

Esperamos que esta guía sobre cómo habilitar el inicio de sesión en el controlador MongoDB Node.JS y Mongoose le haya sido útil en su configuración. Siéntase libre de dejar un comentario en la sección de comentarios a continuación si tiene alguna pregunta o necesita ayuda.