Questo è stato chiesto molto tempo fa, ma questo può ancora aiutare qualcuno:
Il profiler di MongoDB registra tutte le query nel sistema di raccolta con limiti.profilo . Vedi questo: database profiler
- Avviare l'istanza mongod con l'
--profile=2
opzione che abilita la registrazione di tutte le query
OPPURE se le istanze mongod sono già in esecuzione, da mongoshell, eseguire db.setProfilingLevel(2)
dopo aver selezionato il database. (può essere verificato da db.getProfilingLevel()
, che dovrebbe restituire 2
)
- Dopo questo, ho creato uno script che utilizza il cursore disponibile di mongodb per seguire questa raccolta system.profile e scrivere le voci in un file. Per visualizzare i registri Ho solo bisogno di coda esso:
tail -f ../logs/mongologs.txt
. Questo script può essere avviato in background e registrerà tutte le operazioni sul db nel file.
Il mio codice per il cursore disponibile per la raccolta system.profile è in nodejs; registra tutte le operazioni insieme alle query che si verificano in ogni raccolta di 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'))
})
});
}
Per il cursore disponibile in Python usando pymongo, fare riferimento al codice seguente che filtra per MyCollection e inserisce solo l'operazione:
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)
Nota: il cursore disponibile funziona solo con raccolte limitate. Non può essere utilizzato per registrare direttamente le operazioni su una raccolta, utilizzare invece il filtro:'ns': 'MyDb.MyCollection'
Nota: capisco che i precedenti nodejs e il codice python potrebbero non essere di grande aiuto per alcuni. Ho appena fornito i codici per riferimento.
Usa questo link per trovare la documentazione per il cursore disponibile nella tua lingua / driver scelto Mongodb di
Un'altra caratteristica che ho aggiunto dopo questo logrotate .
mongod -vv
ha funzionato per me