Esto se preguntó hace mucho tiempo, pero aún puede ayudar a alguien:
El generador de perfiles MongoDB registra todas las consultas en el sistema de recopilación con tope.perfil . Ver esto: perfil de base de datos
- Inicie la instancia mongod con la
--profile=2
opción que permite registrar todas las consultas
O si las instancias mongod ya se están ejecutando, desde mongoshell, ejecute db.setProfilingLevel(2)
después de seleccionar la base de datos. (se puede verificar por db.getProfilingLevel()
, que debería volver 2
)
- Después de esto, he creado un script que utiliza el cursor de Taong de mongodb para ajustar esta colección system.profile y escribir las entradas en un archivo. Para ver los registros que sólo tiene que la cola es:
tail -f ../logs/mongologs.txt
. Este script se puede iniciar en segundo plano y registrará todas las operaciones en la base de datos del archivo.
Mi código para el cursor disponible para la colección system.profile está en nodejs; registra todas las operaciones junto con las consultas que ocurren en cada colección 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'))
})
});
}
Para el cursor disponible en python usando pymongo, consulte el siguiente código que filtra para MyCollection y solo inserta la operación:
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: El cursor disponible solo funciona con colecciones con límite. No se puede usar para registrar operaciones en una colección directamente, en su lugar use filter:'ns': 'MyDb.MyCollection'
Nota: Entiendo que los nodos anteriores y el código de Python pueden no ser de mucha ayuda para algunos. Acabo de proporcionar los códigos de referencia.
Utilice este enlace para buscar documentación para el cursor disponible en su idioma / controlador . Controladores Mongodb
Otra característica que he agregado después de este logrotate .
mongod -vv
funcionó para mí