Indsamling af detaljerede logfiler er et kritisk trin ved fejlfinding af forbindelsesrelaterede problemer med MongoDB. I dette korte indlæg vil vi vise, hvordan man aktiverer logning på MongoDB Node.JS-driveren og Mongoose. Vi henviser til Mongoose version 5.x og driverversion 3.5 i denne diskussion.
Logning af MongoDB Node.JS-driveren
Logningsmekanismen for den oprindelige driver er forklaret godt i logningsdokumentationen. Væsentlige funktioner er:
- Der er 3 logniveauer –
debug
,info
,warn
ogerror
. Standard ererror
.info
er et anstændigt valg, når du forsøger at fejlfinde problemer.debug
muliggør ekstremt detaljeret sporing, så brug det kun, når logfilerne genereres påinfo
niveau er ikke nok. - Som standard går logfiler til
console.log()
Indstilling af logniveauet
I kode
const MongoClient = require('mongodb').MongoClient; const Logger = require('mongodb').Logger; Logger.setLevel('info');
Når du indstiller logniveauet i kode, kan du også tilføje filtre til specifikke klasser. F.eks.
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
Via muligheder
logger
og logLevel
kan også videregives via forbindelsesmuligheder, vi viser dig et eksempel i Mongoose-sektionen.
Logger for Mongoose
Det er enkelt at aktivere logning på fejlretningsniveau for Mongoose:
mongoose.set('debug', true)
Dette muliggør dog kun logning af MongoDB-operationer som forespørgsler og opdateringer. Hvis du ønsker at fejlfinde problemer relateret til forbindelsen, forbindelsespuljen osv., så er dette ikke til nogen hjælp.
På den anden side, da Mongoose bruger MongoDB Node.JS-driveren nedenunder, vil vi også være i stand til at hente logfiler fra driveren, hvis vi aktiverer logning for driveren. Den nemmeste måde at gøre dette på er at videregive logrelaterede muligheder. F.eks.
// 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);
Med undtagelse af de Mongoose-specifikke muligheder videregiver Mongoose alle de andre muligheder til føreren. Driverdokumentationen forklarer følgende muligheder:
loggerLevel
– streng – valgfri – Logningsniveauet (fejl/advarsel/info/fejlretning)logger
– objekt – valgfrit – Brugerdefineret loggerobjekt
I eksemplet ovenfor passerer vi loggerLevel
som info
og logger
som console.log
.
Tilpasset logger
Selv om driverdokumentationen giver et eksempel på at skrive brugerdefinerede loggere, er den ikke særlig nyttig. Normalt ville vi forsøge at sende disse logfiler til en anden fil, væk fra standardapplikationslogfilerne, og vi kan bruge den tilpassede loggerfunktionalitet til at gøre det.
Hvis du ser på driverens logningskildekode, bliver følgende klart:
- Standardloggeren er
console.log
- Loggeren skal være en funktion
- Loggerfunktionen tager to argumenter:
- Meddelelsesstrengen i formatet som følger:
[LEVEL-className:pid] timestamp logMsg
For eksempel:
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
- Et tilstandsobjekt, som indeholder følgende information:
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };
For eksempel:
{ 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 }
Så for at skrive en brugerdefineret logger kan du blot skrive en funktion for at bruge en logningsramme efter eget valg til at logge disse meddelelser i et format, som du ønsker.
Her er en ret primitiv Bunyan-logger sat op som en brugerdefineret 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); } }
Send det derefter i dine muligheder:
var options = { logger: mongoLogger, loggerLevel : 'info' }
Oputtet fra console.log vil derefter være:
[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 }
Bunyan-outputtet vil være:
{"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}
Du vil derefter være i stand til at bruge alle funktionerne i Bunyan til at håndtere logfilerne, som du finder passende, f.eks. sende dem til en roterende fil, adskille fejl- og infomeddelelser osv.
Vi håber, at denne guide til at aktivere MongoDB Node.JS-driveren og Mongoose har været nyttig for dig i din opsætning. Du er velkommen til at efterlade en kommentar i kommentarfeltet nedenfor, hvis du har spørgsmål eller har brug for hjælp.