MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak włączyć logowanie dla Mongoose i sterownika MongoDB Node.JS?

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 i error . Wartość domyślna to error . 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 w info 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 .

Jak włączyć logowanie dla Mongoose i sterownika MongoDB Node.JSClick To Tweet

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.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak policzyć liczbę dokumentów w kolekcji mongodb

  2. Jak zainstalować NodeJS z MongoDB na Ubuntu?

  3. Mongoid czy MongoMapper?

  4. Zestawy replik MongoDB z arbitrami

  5. zapytanie sql do mongodb?