sql >> Database >  >> NoSQL >> MongoDB

Logboekregistratie inschakelen voor Mongoose en het MongoDB Node.JS-stuurprogramma

Het verzamelen van gedetailleerde logbestanden is een cruciale stap bij het opsporen van verbindingsproblemen met MongoDB. In dit korte bericht laten we zien hoe u inloggen op het MongoDB Node.JS-stuurprogramma en Mongoose kunt inschakelen. We verwijzen in deze discussie naar de Mongoose-versie 5.x en de driverversie 3.5.

Het MongoDB Node.JS-stuurprogramma loggen

Het logging-mechanisme voor de native driver wordt goed uitgelegd in de logging-documentatie. Essentiële functies zijn:

  • Er zijn 3 logniveaus – debug , info , warn en error . De standaard is error . info is een goede keuze bij het oplossen van problemen. debug maakt extreem gedetailleerde tracering mogelijk, dus gebruik dat alleen wanneer de logs zijn gegenereerd op de info niveau zijn niet genoeg.
  • Standaard gaan logs naar console.log()

Het logniveau instellen

In code

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

Als je het logniveau in code instelt, kun je ook filters toevoegen voor specifieke klassen. Bijv.

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

Via opties

De logger en logLevel kan ook worden doorgegeven via verbindingsopties, we laten u een voorbeeld zien in de sectie Mongoose.

Loggen voor mangoest

Logging op foutopsporingsniveau inschakelen voor Mongoose is eenvoudig:

mongoose.set('debug', true)

Dit maakt echter alleen het loggen van MongoDB-bewerkingen zoals query's en updates mogelijk. Als u problemen met de verbinding, verbindingspool, enz. wilt oplossen, heeft dit geen zin.

Aan de andere kant, aangezien Mongoose het MongoDB Node.JS-stuurprogramma hieronder gebruikt, kunnen we, als we logboekregistratie voor het stuurprogramma inschakelen, ook logboeken van het stuurprogramma verkrijgen. De eenvoudigste manier om dit te doen, is door loggerelateerde opties door te geven. Bijv.

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

Behalve de Mongoose-specifieke opties, geeft Mongoose alle andere opties door aan de bestuurder. In de driverdocumentatie worden de volgende opties uitgelegd:

  • loggerLevel – string – optioneel – Het logniveau (error/warn/info/debug)
  • logger – object – optioneel – Aangepast loggerobject

In het bovenstaande voorbeeld geven we het loggerLevel door als info en de logger als console.log .

Logboekregistratie inschakelen voor Mongoose en het MongoDB Node.JS-stuurprogramma Klik om te tweeten

Aangepaste logger

Hoewel de driverdocumentatie een voorbeeld geeft over het schrijven van aangepaste loggers, is het niet erg nuttig. Gewoonlijk zouden we proberen deze logs naar een ander bestand te sturen, weg van de standaard applicatielogs en we kunnen de aangepaste logger-functionaliteit gebruiken om dat te doen.

Als je kijkt naar de log-broncode van het stuurprogramma, wordt het volgende duidelijk:

  • Standaard logger is deconsole.log
  • De logger moet een functie zijn
  • De loggerfunctie duurt twee argumenten:
    • De berichttekenreeks in de volgende notatie:
      [LEVEL-className:pid] timestamp logMsg

      Bijvoorbeeld:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Een statusobject dat de volgende informatie bevat:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Bijvoorbeeld:

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

Dus, om een ​​aangepaste logger te schrijven, kun je eenvoudig een functie schrijven om een ​​logging-framework naar keuze te gebruiken om deze berichten in een door jou gewenst formaat te loggen.

Hier is een vrij primitieve Bunyan-logger die is ingesteld als een aangepaste 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);
  }
}

Geef het dan door in je opties:

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

De uitvoer van console.log is dan:

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

De Bunyan-uitvoer zal zijn:

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

Je kunt dan alle functies van Bunyan gebruiken om de logs naar eigen inzicht te verwerken, b.v. ze naar een roterend bestand sturen, fout- en infoberichten scheiden, enz.

We hopen dat deze handleiding over het inschakelen van inloggen op het MongoDB Node.JS-stuurprogramma en Mongoose nuttig voor u is geweest bij uw installatie. Voel je vrij om een ​​reactie achter te laten in het commentaargedeelte hieronder als je vragen hebt of hulp nodig hebt.


  1. Journaling beheren in MongoDB

  2. Aanbevelingen voor Redis-clientbibliotheek voor gebruik vanuit Scala

  3. Basisprincipes van MongoDB-ketenreplicatie

  4. Hadoop-tellers en soorten tellers in MapReduce