MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come abilitare la registrazione per Mongoose e il driver MongoDB Node.JS

La raccolta di log dettagliati è un passaggio critico durante il debug di problemi relativi alla connessione con MongoDB. In questo breve post, mostreremo come abilitare la registrazione sul driver MongoDB Node.JS e Mongoose. In questa discussione ci riferiamo alla versione 5.x di Mongoose e alla versione 3.5 del driver.

Registrazione del driver MongoDB Node.JS

Il meccanismo di registrazione per il driver nativo è spiegato bene nella documentazione di registrazione. Le caratteristiche essenziali sono:

  • Ci sono 3 livelli di log:debug , info , warn e error . L'impostazione predefinita è error . info è una scelta decente quando si tenta di eseguire il debug dei problemi. debug abilita una traccia estremamente dettagliata, quindi usala solo quando i log generati alle info livello non sono sufficienti.
  • Per impostazione predefinita i log vanno a console.log()

Impostazione del livello di registro

Nel codice

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

Quando imposti il ​​livello di registro nel codice, puoi anche aggiungere filtri per classi specifiche. Es.

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

Tramite opzioni

Il logger e logLevel può essere passato anche tramite opzioni di connessione, ti mostriamo un esempio nella sezione Mangusta.

Registrazione per Mongoose

Abilitare la registrazione del livello di debug per Mongoose è semplice:

mongoose.set('debug', true)

Tuttavia, questo abilita solo la registrazione di operazioni MongoDB come query e aggiornamenti. Se stai cercando di eseguire il debug di problemi relativi alla connessione, al pool di connessioni e così via, questo non è di aiuto.

D'altra parte, poiché Mongoose utilizza il driver MongoDB Node.JS sottostante, se abilitiamo la registrazione per il driver, saremo in grado di ottenere i log anche dal driver. Il modo più semplice per farlo è passare le opzioni relative al registro. Es.

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

Tranne le opzioni specifiche di Mongoose, Mongoose passa tutte le altre opzioni al conducente. La documentazione del driver spiega le seguenti opzioni:

  • loggerLevel – string – optional – Il livello di registrazione (errore/avviso/info/debug)
  • logger – oggetto – opzionale – Oggetto logger personalizzato

Nell'esempio sopra, passiamo il loggerLevel come info e il logger come console.log .

Come abilitare la registrazione per Mongoose e il driver MongoDB Node.JSFai clic per twittare

Registratore personalizzato

Anche se la documentazione del driver fornisce un esempio sulla scrittura di logger personalizzati, non è molto utile. Di solito, proviamo a inviare questi registri a un file diverso, lontano dai registri dell'applicazione standard e possiamo utilizzare la funzionalità di registrazione personalizzata per essere in grado di farlo.

Se guardi il codice sorgente di registrazione del driver, diventa chiaro quanto segue:

  • Il logger predefinito è console.log
  • Il logger deve essere una funzione
  • La funzione logger ne richiede due argomenti:
    • La stringa del messaggio nel formato seguente:
      [LEVEL-className:pid] timestamp logMsg

      Ad esempio:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Un oggetto state che contiene le seguenti informazioni:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Ad esempio:

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

Quindi, per scrivere un logger personalizzato, puoi semplicemente scrivere una funzione per utilizzare un framework di registrazione a tua scelta per registrare questi messaggi nel formato che desideri.

Ecco un logger Bunyan abbastanza primitivo configurato come logger personalizzato:

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

Quindi passalo nelle tue opzioni:

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

L'output da console.log sarà quindi:

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

L'output di Bunyan sarà:

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

Potrai quindi utilizzare tutte le funzionalità di Bunyan per gestire i log come meglio credi, ad es. inviandoli a un file rotante, separando i messaggi di errore e informativi, ecc.

Ci auguriamo che questa guida sull'abilitazione della registrazione sul driver MongoDB Node.JS e su Mongoose ti sia stata utile nella tua configurazione. Sentiti libero di lasciare un commento nella sezione commenti qui sotto se hai domande o hai bisogno di aiuto.