Het verzamelen van gedetailleerde logbestanden is een cruciale stap bij het opsporen van verbindingsproblemen met MongoDB. In dit korte bericht laten we zien hoe u inloggen op het MongoDB Node.JS-stuurprogramma en Mongoose kunt inschakelen. We verwijzen in deze discussie naar de Mongoose-versie 5.x en de driverversie 3.5.
Het MongoDB Node.JS-stuurprogramma loggen
Het logging-mechanisme voor de native driver wordt goed uitgelegd in de logging-documentatie. Essentiële functies zijn:
- Er zijn 3 logniveaus –
debug
,info
,warn
enerror
. De standaard iserror
.info
is een goede keuze bij het oplossen van problemen.debug
maakt extreem gedetailleerde tracering mogelijk, dus gebruik dat alleen wanneer de logs zijn gegenereerd op deinfo
niveau zijn niet genoeg. - Standaard gaan logs naar
console.log()
Het logniveau instellen
In code
const MongoClient = require('mongodb').MongoClient; const Logger = require('mongodb').Logger; Logger.setLevel('info');
Als je het logniveau in code instelt, kun je ook filters toevoegen voor specifieke klassen. Bijv.
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
Via opties
De logger
en logLevel
kan ook worden doorgegeven via verbindingsopties, we laten u een voorbeeld zien in de sectie Mongoose.
Loggen voor mangoest
Logging op foutopsporingsniveau inschakelen voor Mongoose is eenvoudig:
mongoose.set('debug', true)
Dit maakt echter alleen het loggen van MongoDB-bewerkingen zoals query's en updates mogelijk. Als u problemen met de verbinding, verbindingspool, enz. wilt oplossen, heeft dit geen zin.
Aan de andere kant, aangezien Mongoose het MongoDB Node.JS-stuurprogramma hieronder gebruikt, kunnen we, als we logboekregistratie voor het stuurprogramma inschakelen, ook logboeken van het stuurprogramma verkrijgen. De eenvoudigste manier om dit te doen, is door loggerelateerde opties door te geven. Bijv.
// 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);
Behalve de Mongoose-specifieke opties, geeft Mongoose alle andere opties door aan de bestuurder. In de driverdocumentatie worden de volgende opties uitgelegd:
loggerLevel
– string – optioneel – Het logniveau (error/warn/info/debug)logger
– object – optioneel – Aangepast loggerobject
In het bovenstaande voorbeeld geven we het loggerLevel
door als info
en de logger
als console.log
.
Aangepaste logger
Hoewel de driverdocumentatie een voorbeeld geeft over het schrijven van aangepaste loggers, is het niet erg nuttig. Gewoonlijk zouden we proberen deze logs naar een ander bestand te sturen, weg van de standaard applicatielogs en we kunnen de aangepaste logger-functionaliteit gebruiken om dat te doen.
Als je kijkt naar de log-broncode van het stuurprogramma, wordt het volgende duidelijk:
- Standaard logger is de
console.log
- De logger moet een functie zijn
- De loggerfunctie duurt twee argumenten:
- De berichttekenreeks in de volgende notatie:
[LEVEL-className:pid] timestamp logMsg
Bijvoorbeeld:
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
- Een statusobject dat de volgende informatie bevat:
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };
Bijvoorbeeld:
{ 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 }
Dus, om een aangepaste logger te schrijven, kun je eenvoudig een functie schrijven om een logging-framework naar keuze te gebruiken om deze berichten in een door jou gewenst formaat te loggen.
Hier is een vrij primitieve Bunyan-logger die is ingesteld als een aangepaste logger:
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); } }
Geef het dan door in je opties:
var options = { logger: mongoLogger, loggerLevel : 'info' }
De uitvoer van console.log is dan:
[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 }
De Bunyan-uitvoer zal zijn:
{"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}
Je kunt dan alle functies van Bunyan gebruiken om de logs naar eigen inzicht te verwerken, b.v. ze naar een roterend bestand sturen, fout- en infoberichten scheiden, enz.
We hopen dat deze handleiding over het inschakelen van inloggen op het MongoDB Node.JS-stuurprogramma en Mongoose nuttig voor u is geweest bij uw installatie. Voel je vrij om een reactie achter te laten in het commentaargedeelte hieronder als je vragen hebt of hulp nodig hebt.