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,warndanerror. Standarnya adalaherror.infoadalah pilihan yang layak saat mencoba men-debug masalah.debugmemungkinkan pelacakan yang sangat mendetail, jadi gunakan itu hanya ketika log dibuat diinfolevel 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.