sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man aktiverar loggning för Mongoose och MongoDB Node.JS-drivrutinen

Insamling av detaljerade loggar är ett kritiskt steg vid felsökning av anslutningsrelaterade problem med MongoDB. I det här korta inlägget kommer vi att visa hur man aktiverar inloggning på MongoDB Node.JS-drivrutinen och Mongoose. Vi hänvisar till Mongoose version 5.x och drivrutinsversion 3.5 i denna diskussion.

Logga MongoDB Node.JS-drivrutinen

Loggningsmekanismen för den inbyggda drivrutinen förklaras väl i loggningsdokumentationen. Viktiga funktioner är:

  • Det finns tre loggnivåer – debug , info , warn och error . Standard är error . info är ett anständigt val när du försöker felsöka problem. debug möjliggör extremt detaljerad spårning, så använd det endast när loggarna genereras vid info nivån räcker inte till.
  • Som standard går loggar till console.log()

Ställa in loggnivån

I kod

const MongoClient = require('mongodb').MongoClient;
const Logger = require('mongodb').Logger;
Logger.setLevel('info');

När du ställer in loggnivån i koden kan du också lägga till filter för specifika klasser. T.ex.

Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things

Via alternativ

logger och logLevel kan också skickas via anslutningsalternativ, vi visar dig ett exempel i Mongoose-sektionen.

Loggar för Mongoose

Att aktivera felsökningsnivåloggning för Mongoose är enkelt:

mongoose.set('debug', true)

Det här möjliggör dock bara loggning av MongoDB-operationer som frågor och uppdateringar. Om du funderar på att felsöka problem relaterade till anslutningen, anslutningspoolen, etc, är detta till ingen hjälp.

Å andra sidan, eftersom Mongoose använder MongoDB Node.JS-drivrutinen under, om vi aktiverar loggning för drivrutinen, kommer vi att kunna erhålla loggar från drivrutinen också. Det enklaste sättet att göra detta är att skicka loggrelaterade alternativ. T.ex.

// 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);

Förutom de Mongoose-specifika alternativen skickar Mongoose alla andra alternativ till föraren. Drivrutinens dokumentation förklarar följande alternativ:

  • loggerLevel – sträng – valfritt – Loggningsnivån (error/warn/info/debug)
  • logger – objekt – valfritt – Anpassat loggerobjekt

I exemplet ovan passerar vi loggerLevel som info och logger som console.log .

Hur man aktiverar loggning för Mongoose och MongoDB Node.JS-drivrutinenKlicka för att tweeta

Anpassad Logger

Även om drivrutinsdokumentationen ger ett exempel på att skriva anpassade loggare, är det inte särskilt användbart. Vanligtvis skulle vi försöka skicka dessa loggar till en annan fil, bort från standardprogramloggarna och vi kan använda den anpassade loggerfunktionen för att kunna göra det.

Om du tittar på loggningskällkoden för drivrutinen blir följande tydligt:

  • Standardloggaren är console.log
  • Loggern måste vara en funktion
  • Loggerfunktionen tar två argument:
    • Meddelandesträngen i formatet enligt följande:
      [LEVEL-className:pid] timestamp logMsg

      Till exempel:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Ett tillståndsobjekt som innehåller följande information:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Till exempel:

      {
         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
      }
      

Så för att skriva en anpassad logger kan du helt enkelt skriva en funktion för att använda ett loggningsramverk som du väljer för att logga dessa meddelanden i ett format som du önskar.

Här är en ganska primitiv Bunyan-logger inställd som en anpassad logger:

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);
  }
}

Skicka det sedan i dina alternativ:

var options = {
  logger: mongoLogger,
  loggerLevel : 'info'
}

Utdata från console.log blir då:

[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 }

Bunyan-utgången blir:

{"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}

Du kommer då att kunna använda alla funktioner i Bunyan för att hantera loggarna som du vill, t.ex. skicka dem till en roterande fil, separera fel- och infomeddelanden etc.

Vi hoppas att den här guiden för att aktivera inloggning på MongoDB Node.JS-drivrutinen och Mongoose har varit till hjälp för dig i din installation. Lämna gärna en kommentar i kommentarsfältet nedan om du har några frågor eller behöver hjälp.


  1. Benchmarking MongoDB - Driving NoSQL Performance

  2. 6 bästa MapReduce Job Optimization Techniques

  3. Korrekt dölja databasuppgifter

  4. Accenter lagrade i Redis är inte läsbara