Zbieranie szczegółowych dzienników jest kluczowym krokiem podczas debugowania problemów związanych z połączeniem z MongoDB. W tym krótkim poście pokażemy, jak włączyć logowanie w sterowniku MongoDB Node.JS i Mongoose. W tej dyskusji odwołujemy się do wersji Mongoose 5.x i sterownika w wersji 3.5.
Logowanie sterownika MongoDB Node.JS
Mechanizm rejestrowania dla sterownika natywnego jest dobrze wyjaśniony w dokumentacji rejestrowania. Podstawowe funkcje to:
- Istnieją 3 poziomy dziennika –
debug
,info
,warn
ierror
. Wartość domyślna toerror
.info
to dobry wybór przy próbie debugowania problemów.debug
umożliwia niezwykle szczegółowe śledzenie, więc używaj go tylko wtedy, gdy logi generowane winfo
poziom nie wystarczy. - Domyślnie logi trafiają do
console.log()
Ustawianie poziomu logowania
W kodzie
const MongoClient = require('mongodb').MongoClient; const Logger = require('mongodb').Logger; Logger.setLevel('info');
Ustawiając poziom rejestrowania w kodzie, możesz również dodać filtry dla określonych klas. Np.
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
Opcje za pomocą
logger
i logLevel
można również przekazać za pomocą opcji połączenia, pokazujemy przykład w sekcji Mongoose.
Logowanie dla Mongoose
Włączenie rejestrowania poziomu debugowania dla Mongoose jest proste:
mongoose.set('debug', true)
Jednak umożliwia to tylko rejestrowanie operacji MongoDB, takich jak zapytania i aktualizacje. Jeśli chcesz debugować problemy związane z połączeniem, pulą połączeń itp., to nie pomoże.
Z drugiej strony, ponieważ Mongoose wykorzystuje znajdujący się poniżej sterownik MongoDB Node.JS, jeśli włączymy logowanie dla tego sterownika, będziemy mogli również uzyskać logi ze sterownika. Najprostszym sposobem na to jest przekazanie opcji związanych z logami. Np.
// 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);
Z wyjątkiem opcji specyficznych dla Mongoose, Mongoose przekazuje wszystkie pozostałe opcje kierowcy. Dokumentacja sterownika wyjaśnia następujące opcje:
loggerLevel
– ciąg – opcjonalnie – Poziom logowania (błąd/ostrzeżenie/informacje/debug)logger
– obiekt – opcjonalnie – Niestandardowy obiekt rejestratora
W powyższym przykładzie przekazujemy loggerLevel
jako info
i logger
jako console.log
.
Niestandardowy rejestrator
Mimo że dokumentacja sterownika zawiera przykład pisania niestandardowych rejestratorów, nie jest ona zbyt użyteczna. Zwykle próbujemy wysłać te dzienniki do innego pliku, z dala od standardowych dzienników aplikacji i możemy użyć niestandardowej funkcji rejestratora, aby to zrobić.
Jeśli spojrzysz na kod źródłowy logowania sterownika, następujące staje się jasne:
- Domyślnym rejestratorem jest
console.log
- Rejestr musi być funkcją
- Funkcja rejestratora zajmuje dwa argumenty:
- Ciąg komunikatu w następującym formacie:
[LEVEL-className:pid] timestamp logMsg
Na przykład:
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
- Obiekt stanu, który zawiera następujące informacje:
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };
Na przykład:
{ 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 }
Tak więc, aby napisać niestandardowy rejestrator, możesz po prostu napisać funkcję, która użyje wybranej struktury rejestrowania do rejestrowania tych wiadomości w żądanym formacie.
Oto dość prymitywny rejestrator Bunyan skonfigurowany jako rejestrator niestandardowy:
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); } }
Następnie przekaż go w swoich opcjach:
var options = { logger: mongoLogger, loggerLevel : 'info' }
Wynikiem pliku console.log będzie wtedy:
[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 }
Wynikiem Bunyana będzie:
{"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}
Dzięki temu będziesz mógł korzystać ze wszystkich funkcji Bunyana, aby radzić sobie z dziennikami według własnego uznania, np. wysyłając je do rotującego pliku, oddzielając komunikaty o błędach i informacje itp.
Mamy nadzieję, że ten przewodnik dotyczący włączania rejestrowania w sterowniku MongoDB Node.JS i Mongoose był pomocny podczas konfiguracji. Jeśli masz jakieś pytania lub potrzebujesz pomocy, możesz zostawić komentarz w sekcji komentarzy poniżej.