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
danerror
. Standarnya adalaherror
.info
adalah pilihan yang layak saat mencoba men-debug masalah.debug
memungkinkan pelacakan yang sangat mendetail, jadi gunakan itu hanya ketika log dibuat diinfo
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
.
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 adalah
console.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.