Shromažďování podrobných protokolů je zásadním krokem při ladění problémů souvisejících s připojením s MongoDB. V tomto krátkém příspěvku si ukážeme, jak povolit protokolování na ovladači MongoDB Node.JS a Mongoose. V této diskusi odkazujeme na verzi Mongoose 5.xa ovladač verze 3.5.
Protokolování ovladače MongoDB Node.JS
Mechanismus protokolování pro nativní ovladač je dobře vysvětlen v dokumentaci protokolování. Základní funkce jsou:
- Existují 3 úrovně protokolu –
debug
,info
,warn
aerror
. Výchozí hodnota jeerror
.info
je slušná volba při pokusu o ladění problémů.debug
umožňuje extrémně podrobné trasování, takže jej používejte pouze tehdy, když jsou protokoly generovány nainfo
úroveň nestačí. - Ve výchozím nastavení protokoly jdou na
console.log()
Nastavení úrovně protokolu
V kódu
const MongoClient = require('mongodb').MongoClient; const Logger = require('mongodb').Logger; Logger.setLevel('info');
Při nastavování úrovně protokolu v kódu můžete také přidat filtry pro konkrétní třídy. Např.
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
Pomocí možností
logger
a logLevel
lze také předat prostřednictvím možností připojení, příklad vám ukážeme v sekci Mongoose.
Přihlašování pro Mongoose
Povolení protokolování úrovně ladění pro Mongoose je jednoduché:
mongoose.set('debug', true)
To však umožňuje pouze protokolování operací MongoDB, jako jsou dotazy a aktualizace. Pokud hledáte ladění problémů souvisejících s připojením, fondem připojení atd., pak vám to nepomůže.
Na druhou stranu, protože Mongoose používá níže ovladač MongoDB Node.JS, pokud povolíme protokolování pro ovladač, budeme moci získat protokoly také z ovladače. Nejjednodušší způsob, jak toho dosáhnout, je předat možnosti související s protokolem. Např.
// 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);
S výjimkou možností specifických pro Mongoose předává Mongoose všechny ostatní možnosti ovladači. Dokumentace ovladače vysvětluje následující možnosti:
loggerLevel
– řetězec – volitelné – Úroveň protokolování (chyba/upozornění/informace/ladění)logger
– objekt – volitelné – Vlastní objekt záznamníku
Ve výše uvedeném příkladu předáme loggerLevel
jako info
a logger
jako console.log
.
Vlastní záznamník
Přestože dokumentace ovladače poskytuje příklad psaní vlastních loggerů, není příliš užitečná. Obvykle bychom se pokusili odeslat tyto protokoly do jiného souboru, mimo standardní protokoly aplikací, a k tomu můžeme použít funkci vlastního loggeru.
Pokud se podíváte na protokolovaný zdrojový kód ovladače, bude jasné následující:
- Výchozím protokolem je
console.log
- Protokol musí být funkce
- Funkce záznamníku vyžaduje dvě argumenty:
- Řetězec zprávy v následujícím formátu:
[LEVEL-className:pid] timestamp logMsg
Například:
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
- Objekt stavu, který obsahuje následující informace:
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };
Například:
{ 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 }
Abyste mohli napsat vlastní záznamník, můžete jednoduše napsat funkci, která bude používat protokolovací rámec dle vašeho výběru k protokolování těchto zpráv ve formátu, který si přejete.
P>Zde je poměrně primitivní záznamník Bunyan nastavený jako vlastní záznamník:
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); } }
Potom to předejte ve svých možnostech:
var options = { logger: mongoLogger, loggerLevel : 'info' }
Výstup z console.log pak bude:
[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 }
Výstup Bunyan bude:
{"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}
Potom budete moci používat všechny funkce Bunyana k nakládání s protokoly, jak uznáte za vhodné, např. odesílání do rotujícího souboru, oddělování chybových a informačních zpráv atd.
Doufáme, že tento průvodce povolením přihlášení k ovladači MongoDB Node.JS a Mongoose vám byl při nastavení užitečný. Neváhejte zanechat komentář v sekci komentářů níže, pokud máte nějaké dotazy nebo potřebujete pomoc.