यह एक लंबे समय से पहले पूछा गया था लेकिन यह अभी भी किसी की मदद कर सकता है:
MongoDB प्रोफाइलर कैप्ड कलेक्शन सिस्टम.प्रोफाइल में सभी प्रश्नों को लॉग करता है । इसे देखें: डेटाबेस प्रोफाइलर
--profile=2
विकल्प के साथ मोंगॉड इंस्टेंस शुरू करें जो सभी प्रश्नों को लॉग करने में सक्षम बनाता है
या यदि मोंगॉड इंस्टेंस पहले से ही चल रहा है, तो मोंगोसल से, db.setProfilingLevel(2)
डेटाबेस का चयन करने के बाद चलाएं । (यह सत्यापित किया जा सकता है db.getProfilingLevel()
, जिसे वापस लौटना चाहिए2
)
- इसके बाद, मैंने एक स्क्रिप्ट बनाई है जो इस सिस्टम को साझा करने के लिए मोंगोडब के टैब्लेट कर्सर का उपयोग करती है । एक संग्रह में प्रविष्टियां और एक फाइल में प्रविष्टियां लिखना। लॉग मैं सिर्फ यह पूंछ की जरूरत है देखने के लिए:
tail -f ../logs/mongologs.txt
। इस स्क्रिप्ट को पृष्ठभूमि में शुरू किया जा सकता है और यह फ़ाइल में db पर सभी ऑपरेशन को लॉग करेगा।
System.profile संग्रह के लिए नोडल कर्सर के लिए मेरा कोड नोडज में है; यह 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'))
})
});
}
Pyongo का उपयोग करते हुए अजगर में अशुभ कर्सर के लिए, निम्न कोड देखें जो MyCollection के लिए फ़िल्टर करता है और केवल सेवा सम्मिलित करता है:
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)
नोट: टैबलट कर्सर केवल कैप्ड कलेक्शन के साथ काम करता है। इसका उपयोग सीधे किसी संग्रह पर कार्रवाई लॉग करने के लिए नहीं किया जा सकता है, इसके बजाय फ़िल्टर का उपयोग करें:'ns': 'MyDb.MyCollection'
नोट: मैं समझता हूं कि उपरोक्त नोडज और अजगर कोड कुछ के लिए बहुत मददगार नहीं हो सकते हैं। मैंने केवल संदर्भ के लिए कोड प्रदान किए हैं।
अपने लिंक / ड्राइवर की पसंद में टैबलट कर्सर के लिए प्रलेखन खोजने के लिए इस लिंक का उपयोग करें Mongodb ड्राइवर्स
एक अन्य विशेषता जो मैंने इस लॉगोटेट के बाद जोड़ी है ।
mongod -vv
मेरे लिए काम किया