sql >> Databáze >  >> NoSQL >> MongoDB

Jak povolit protokolování pro Mongoose a ovladač MongoDB Node.JS

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 a error . Výchozí hodnota je error . 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 na info ú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 .

Jak povolit protokolování pro Mongoose a ovladač MongoDB Node.JSClick To Tweet

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.


  1. Rdbtools ve společnosti Redis Conf18

  2. Mongo DB najít podle názvu pole s libovolnou hodnotou

  3. Naformátujte číslo jako měnu v SQL

  4. Jak atomicky odstranit klíče odpovídající vzoru pomocí Redis