Cela a été demandé il y a longtemps, mais cela peut encore aider quelqu'un:
Le profileur MongoDB enregistre toutes les requêtes dans le système de collecte plafonné . Voir ceci: profileur de base de données
- Démarrez l'instance mongod avec l'
--profile=2
option qui permet de journaliser toutes les requêtes
OU si les instances mongod sont déjà en cours d'exécution, à partir de mongoshell, exécutez db.setProfilingLevel(2)
après avoir sélectionné la base de données. (il peut être vérifié par db.getProfilingLevel()
, qui devrait revenir 2
)
- Après cela, j'ai créé un script qui utilise le curseur tailable de mongodb pour suivre cette collection system.profile et écrire les entrées dans un fichier. Pour afficher les journaux que j'ai juste besoin de la queue , il:
tail -f ../logs/mongologs.txt
. Ce script peut être lancé en arrière-plan et il enregistrera toutes les opérations sur la base de données dans le fichier.
Mon code pour le curseur disponible pour la collection system.profile est dans nodejs; il enregistre toutes les opérations ainsi que les requêtes se produisant dans chaque collection de 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'))
})
});
}
Pour le curseur disponible en python utilisant pymongo, reportez-vous au code suivant qui filtre pour MyCollection et insère uniquement l'opération:
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)
Remarque: le curseur disponible ne fonctionne qu'avec les collections plafonnées. Il ne peut pas être utilisé pour enregistrer directement des opérations sur une collection, utilisez plutôt un filtre:'ns': 'MyDb.MyCollection'
Remarque: je comprends que les nodejs et le code python ci-dessus peuvent ne pas être d'une grande aide pour certains. Je viens de fournir les codes pour référence.
Utilisez ce lien pour trouver de la documentation sur le curseur disponible dans votre langue / choix de pilote Mongodb Drivers
Une autre fonctionnalité que j'ai ajoutée après ce logrotate .
mongod -vv
travaillé pour moi