Ini sudah lama ditanyakan tetapi ini mungkin masih membantu seseorang:
Profiler MongoDB mencatat semua kueri dalam sistem pengumpulan capped.profile . Lihat ini: profiler basis data
- Mulai instance mongod dengan
--profile=2
opsi yang memungkinkan logging semua permintaan
ATAU jika instance mongod sudah berjalan, dari mongoshell, jalankan db.setProfilingLevel(2)
setelah memilih database. (dapat diverifikasi oleh db.getProfilingLevel()
, yang harus dikembalikan2
)
- Setelah ini, saya telah membuat skrip yang menggunakan kursor mongodb yang tersedia untuk mengekor system.profile ini mengumpulkan dan menulis entri dalam file. Untuk melihat log saya hanya perlu ekor itu:
tail -f ../logs/mongologs.txt
. Skrip ini dapat dimulai di latar belakang dan akan mencatat semua operasi pada db dalam file.
Kode saya untuk kursor yang tersedia untuk koleksi system.profile ada di nodejs; itu mencatat semua operasi bersama dengan kueri yang terjadi di setiap koleksi MyDb:
const MongoClient = require('mongodb').MongoClient;
const assert = require('assert');
const fs = require('fs');
const file = '../logs/mongologs'
// Connection URL
const url = 'mongodb://localhost:27017';
// Database Name
const dbName = 'MyDb';
//Mongodb connection
MongoClient.connect(url, function (err, client) {
assert.equal(null, err);
const db = client.db(dbName);
listen(db, {})
});
function listen(db, conditions) {
var filter = { ns: { $ne: 'MyDb.system.profile' } }; //filter for query
//e.g. if we need to log only insert queries, use {op:'insert'}
//e.g. if we need to log operation on only 'MyCollection' collection, use {ns: 'MyDb.MyCollection'}
//we can give a lot of filters, print and check the 'document' variable below
// set MongoDB cursor options
var cursorOptions = {
tailable: true,
awaitdata: true,
numberOfRetries: -1
};
// create stream and listen
var stream = db.collection('system.profile').find(filter, cursorOptions).stream();
// call the callback
stream.on('data', function (document) {
//this will run on every operation/query done on our database
//print 'document' to check the keys based on which we can filter
//delete data which we dont need in our log file
delete document.execStats;
delete document.keysExamined;
//-----
//-----
//append the log generated in our log file which can be tailed from command line
fs.appendFile(file, JSON.stringify(document) + '\n', function (err) {
if (err) (console.log('err'))
})
});
}
Untuk kursor yang tersedia di python menggunakan pymongo, lihat kode berikut yang memfilter untuk MyCollection dan hanya memasukkan operasi:
import pymongo
import time
client = pymongo.MongoClient()
oplog = client.MyDb.system.profile
first = oplog.find().sort('$natural', pymongo.ASCENDING).limit(-1).next()
ts = first['ts']
while True:
cursor = oplog.find({'ts': {'$gt': ts}, 'ns': 'MyDb.MyCollection', 'op': 'insert'},
cursor_type=pymongo.CursorType.TAILABLE_AWAIT)
while cursor.alive:
for doc in cursor:
ts = doc['ts']
print(doc)
print('\n')
time.sleep(1)
Catatan: Kursor yang tersedia hanya berfungsi dengan koleksi yang dibatasi. Itu tidak dapat digunakan untuk mencatat operasi pada koleksi secara langsung, sebagai gantinya gunakan filter:'ns': 'MyDb.MyCollection'
Catatan: Saya mengerti bahwa nodejs dan kode python di atas mungkin tidak banyak membantu bagi sebagian orang. Saya baru saja memberikan kode untuk referensi.
Gunakan tautan ini untuk menemukan dokumentasi untuk kursor yang tersedia di Bahasa / Driver pilihan Mongodb Drivers Anda
Fitur lain yang saya tambahkan setelah logrotate ini .
mongod -vv
bekerja untuk saya