sql >> Database teknologi >  >> NoSQL >> MongoDB

Sådan aktiveres logning for Mongoose og MongoDB Node.JS-driveren

Indsamling af detaljerede logfiler er et kritisk trin ved fejlfinding af forbindelsesrelaterede problemer med MongoDB. I dette korte indlæg vil vi vise, hvordan man aktiverer logning på MongoDB Node.JS-driveren og Mongoose. Vi henviser til Mongoose version 5.x og driverversion 3.5 i denne diskussion.

Logning af MongoDB Node.JS-driveren

Logningsmekanismen for den oprindelige driver er forklaret godt i logningsdokumentationen. Væsentlige funktioner er:

  • Der er 3 logniveauer – debug , info , warn og error . Standard er error . info er et anstændigt valg, når du forsøger at fejlfinde problemer. debug muliggør ekstremt detaljeret sporing, så brug det kun, når logfilerne genereres på info niveau er ikke nok.
  • Som standard går logfiler til console.log()

Indstilling af logniveauet

I kode

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

Når du indstiller logniveauet i kode, kan du også tilføje filtre til specifikke klasser. F.eks.

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

Via muligheder

logger og logLevel kan også videregives via forbindelsesmuligheder, vi viser dig et eksempel i Mongoose-sektionen.

Logger for Mongoose

Det er enkelt at aktivere logning på fejlretningsniveau for Mongoose:

mongoose.set('debug', true)

Dette muliggør dog kun logning af MongoDB-operationer som forespørgsler og opdateringer. Hvis du ønsker at fejlfinde problemer relateret til forbindelsen, forbindelsespuljen osv., så er dette ikke til nogen hjælp.

På den anden side, da Mongoose bruger MongoDB Node.JS-driveren nedenunder, vil vi også være i stand til at hente logfiler fra driveren, hvis vi aktiverer logning for driveren. Den nemmeste måde at gøre dette på er at videregive logrelaterede muligheder. F.eks.

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

Med undtagelse af de Mongoose-specifikke muligheder videregiver Mongoose alle de andre muligheder til føreren. Driverdokumentationen forklarer følgende muligheder:

  • loggerLevel – streng – valgfri – Logningsniveauet (fejl/advarsel/info/fejlretning)
  • logger – objekt – valgfrit – Brugerdefineret loggerobjekt

I eksemplet ovenfor passerer vi loggerLevel som info og logger som console.log .

Sådan aktiverer du logning for Mongoose og MongoDB Node.JS-driverenKlik for at tweete

Tilpasset logger

Selv om driverdokumentationen giver et eksempel på at skrive brugerdefinerede loggere, er den ikke særlig nyttig. Normalt ville vi forsøge at sende disse logfiler til en anden fil, væk fra standardapplikationslogfilerne, og vi kan bruge den tilpassede loggerfunktionalitet til at gøre det.

Hvis du ser på driverens logningskildekode, bliver følgende klart:

  • Standardloggeren er console.log
  • Loggeren skal være en funktion
  • Loggerfunktionen tager to argumenter:
    • Meddelelsesstrengen i formatet som følger:
      [LEVEL-className:pid] timestamp logMsg

      For eksempel:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Et tilstandsobjekt, som indeholder følgende information:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      For eksempel:

      {
         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å for at skrive en brugerdefineret logger kan du blot skrive en funktion for at bruge en logningsramme efter eget valg til at logge disse meddelelser i et format, som du ønsker.

Her er en ret primitiv Bunyan-logger sat op som en brugerdefineret 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);
  }
}

Send det derefter i dine muligheder:

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

Oputtet fra console.log vil derefter være:

[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-outputtet vil være:

{"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 vil derefter være i stand til at bruge alle funktionerne i Bunyan til at håndtere logfilerne, som du finder passende, f.eks. sende dem til en roterende fil, adskille fejl- og infomeddelelser osv.

Vi håber, at denne guide til at aktivere MongoDB Node.JS-driveren og Mongoose har været nyttig for dig i din opsætning. Du er velkommen til at efterlade en kommentar i kommentarfeltet nedenfor, hvis du har spørgsmål eller har brug for hjælp.


  1. De tre A'er for MongoDB Security - Autentificering, autorisation og revision

  2. Meteor:upload af fil fra klient til Mongo samling vs filsystem vs GridFS

  3. Hvordan bruger man de dumpede data fra mongodump?

  4. MongoDB Whitespace-tegn