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,warnaerror. Výchozí hodnota jeerror.infoje slušná volba při pokusu o ladění problémů.debugumožň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.