MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment activer la journalisation pour Mongoose et le pilote MongoDB Node.JS

La collecte de journaux détaillés est une étape critique lors du débogage des problèmes liés à la connexion avec MongoDB. Dans ce court article, nous montrerons comment activer la journalisation sur le pilote MongoDB Node.JS et Mongoose. Nous nous référons à la version 5.x de Mongoose et à la version 3.5 du pilote dans cette discussion.

Journaliser le pilote MongoDB Node.JS

Le mécanisme de journalisation pour le pilote natif est bien expliqué dans la documentation de journalisation. Les fonctionnalités essentielles sont :

  • Il existe 3 niveaux de journalisation :debug , info , warn et error . La valeur par défaut est error . info est un choix décent lorsque vous essayez de déboguer des problèmes. debug permet un traçage extrêmement détaillé, donc utilisez-le uniquement lorsque les journaux générés à l'info le niveau ne suffit pas.
  • Par défaut, les journaux vont à console.log()

Définir le niveau de journalisation

Dans le code

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

Lorsque vous définissez le niveau de journalisation dans le code, vous pouvez également ajouter des filtres pour des classes spécifiques. Par exemple

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

Par les options

Le logger et logLevel peut également être transmis via les options de connexion, nous vous montrons un exemple dans la section Mangouste.

Enregistrement pour Mongoose

L'activation de la journalisation au niveau du débogage pour Mongoose est simple :

mongoose.set('debug', true)

Cependant, cela n'active que la journalisation des opérations MongoDB telles que les requêtes et les mises à jour. Si vous cherchez à déboguer des problèmes liés à la connexion, au pool de connexions, etc., cela ne vous sera d'aucune utilité.

D'autre part, étant donné que Mongoose utilise le pilote MongoDB Node.JS en dessous, si nous activons la journalisation pour le pilote, nous pourrons également obtenir les journaux du pilote. La façon la plus simple de le faire est de passer les options liées au journal. Par exemple

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

À l'exception des options spécifiques à Mongoose, Mongoose transmet toutes les autres options au pilote. La documentation du pilote explique les options suivantes :

  • loggerLevel – chaîne – facultatif – Le niveau de journalisation (error/warn/info/debug)
  • logger – objet – facultatif – Objet de journalisation personnalisé

Dans l'exemple ci-dessus, nous passons le loggerLevel comme info et le logger comme console.log .

Comment activer la journalisation pour Mongoose et le pilote MongoDB Node.JSClick To Tweet

Enregistreur personnalisé

Même si la documentation du pilote fournit un exemple sur l'écriture d'enregistreurs personnalisés, ce n'est pas très utile. Habituellement, nous essayons d'envoyer ces journaux dans un fichier différent, loin des journaux d'application standard et nous pouvons utiliser la fonctionnalité de journalisation personnalisée pour pouvoir le faire.

Si vous regardez le code source de journalisation du pilote, ce qui suit devient clair :

  • L'enregistreur par défaut est console.log
  • Le logger doit être une fonction
  • La fonction d'enregistrement prend deux arguments :
    • La chaîne de message au format suivant :
      [LEVEL-className:pid] timestamp logMsg

      Par exemple :

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Un objet d'état qui contient les informations suivantes :
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Par exemple :

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

Ainsi, afin d'écrire un enregistreur personnalisé, vous pouvez simplement écrire une fonction pour utiliser un cadre de journalisation de votre choix pour enregistrer ces messages dans un format que vous souhaitez.

Voici un enregistreur Bunyan assez primitif configuré en tant qu'enregistreur personnalisé :

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

Ensuite, passez-le dans vos options :

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

La sortie de console.log sera alors :

[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 sortie Bunyan sera :

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

Vous pourrez alors utiliser toutes les fonctionnalités de Bunyan pour gérer les logs comme bon vous semble, par ex. en les envoyant dans un fichier rotatif, en séparant les messages d'erreur et d'information, etc.

Nous espérons que ce guide sur l'activation de la journalisation sur le pilote MongoDB Node.JS et Mongoose vous a été utile dans votre configuration. N'hésitez pas à laisser un commentaire dans la section des commentaires ci-dessous si vous avez des questions ou avez besoin d'aide.