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
eerror
. 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 alleinfo
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
.
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.