MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara mengaktifkan logging untuk Mongoose dan driver MongoDB Node.JS

Mengumpulkan log mendetail adalah langkah penting saat men-debug masalah terkait koneksi dengan MongoDB. Dalam posting singkat ini, kami akan menunjukkan cara mengaktifkan logging pada driver MongoDB Node.JS dan Mongoose. Kami merujuk ke Mongoose versi 5.x dan driver versi 3.5 dalam diskusi ini.

Mencatat Log Driver MongoDB Node.JS

Mekanisme logging untuk driver asli dijelaskan dengan baik dalam dokumentasi logging. Fitur penting adalah:

  • Ada 3 level log – debug , info , warn dan error . Standarnya adalah error . info adalah pilihan yang layak saat mencoba men-debug masalah. debug memungkinkan pelacakan yang sangat mendetail, jadi gunakan itu hanya ketika log dibuat di info level tidak cukup.
  • Secara default, log masuk ke console.log()

Menyetel level log

Dalam kode

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

Saat menyetel level log dalam kode, Anda juga dapat menambahkan filter untuk kelas tertentu. Mis.

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

Melalui opsi

logger dan logLevel juga dapat diteruskan melalui opsi koneksi, kami tunjukkan contoh di bagian Mongoose.

Logging untuk Mongoose

Mengaktifkan logging tingkat debug untuk Mongoose itu sederhana:

mongoose.set('debug', true)

Namun, ini hanya memungkinkan pencatatan operasi MongoDB seperti kueri dan pembaruan. Jika Anda ingin men-debug masalah yang terkait dengan koneksi, kumpulan koneksi, dll, maka ini tidak membantu.

Di sisi lain, karena Mongoose menggunakan driver MongoDB Node.JS di bawahnya, jika kita mengaktifkan logging untuk driver, kita juga dapat memperoleh log dari driver. Cara termudah untuk melakukannya adalah dengan melewatkan opsi terkait log. Mis.

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

Kecuali opsi spesifik Mongoose, Mongoose meneruskan semua opsi lain ke driver. Dokumentasi driver menjelaskan opsi berikut:

  • loggerLevel – string – opsional – Level logging (error/warn/info/debug)
  • logger – objek – opsional – Objek pencatat kustom

Pada contoh di atas, kita melewati loggerLevel sebagai info dan logger sebagai console.log .

Cara mengaktifkan logging untuk Mongoose dan driver MongoDB Node.JSKlik Untuk Tweet

Logger Kustom

Meskipun dokumentasi driver memberikan contoh tentang penulisan custom logger, itu tidak terlalu berguna. Biasanya, kami akan mencoba mengirim log ini ke file yang berbeda, jauh dari log aplikasi standar dan kami dapat menggunakan fungsi logger khusus untuk dapat melakukannya.

Jika Anda melihat kode sumber logging driver, berikut ini menjadi jelas:

  • Logger default adalahconsole.log
  • Logger harus berupa fungsi
  • Fungsi logger membutuhkan dua argumen:
    • String pesan dalam format sebagai berikut:
      [LEVEL-className:pid] timestamp logMsg

      Misalnya:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Objek status yang berisi informasi berikut:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Misalnya:

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

Jadi, untuk menulis pencatat kustom, Anda cukup menulis fungsi untuk menggunakan kerangka logging pilihan Anda untuk mencatat pesan-pesan ini dalam format yang Anda inginkan.

Berikut adalah logger Bunyan yang cukup primitif yang disiapkan sebagai logger kustom:

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

Lalu berikan opsi Anda:

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

Output dari console.log akan menjadi:

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

Output Bunyan akan menjadi:

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

Anda kemudian dapat menggunakan semua fitur Bunyan untuk menangani log sesuai keinginan Anda, mis. mengirimkannya ke file yang berputar, memisahkan pesan kesalahan dan info, dll.

Kami berharap panduan tentang mengaktifkan logging pada driver MongoDB Node.JS dan Mongoose ini telah membantu Anda dalam pengaturan Anda. Jangan ragu untuk meninggalkan komentar di bagian komentar di bawah jika Anda memiliki pertanyaan atau membutuhkan bantuan.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Panjang nilai bidang string di mongoDB

  2. Temukan dokumen dengan array yang tidak berisi dokumen dengan nilai bidang tertentu di MongoDB

  3. Perbarui beberapa elemen dalam array di mongodb

  4. Mengapa hasOwnProperty model luwak mengembalikan false ketika properti memang ada?

  5. Mencocokkan bidang array yang berisi kombinasi apa pun dari array yang disediakan di MongoDB