La question est aussi fondamentale que simple ... Comment enregistrer toutes les requêtes dans un fichier journal "tail" dans mongodb?
J'ai essayé:
Le /var/log/mongodb/mongodb.log continue d'afficher uniquement le nombre actuel de connexions actives ...
J'ai fini par résoudre ce problème en démarrant Mongod comme ceci (martelé et laid, oui ... mais fonctionne pour l'environnement de développement):
mongod --profile=1 --slowms=1 &
Cela active le profilage et définit le seuil pour les "requêtes lentes" sur 1 ms, ce qui entraîne la consignation de toutes les requêtes en tant que "requêtes lentes" dans le fichier:
/var/log/mongodb/mongodb.log
Maintenant, je reçois des sorties de journal continues en utilisant la commande:
tail -f /var/log/mongodb/mongodb.log
Un exemple de journal:
Mon Mar 4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms
Vous pouvez enregistrer toutes les requêtes:
$ mongo
MongoDB Shell version: 2.4.9
connecting to: test
> use myDb
switched to db myDb
> db.getProfilingLevel()
0
> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> db.system.profile.find().pretty()
Source: http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/
db.setProfilingLevel(2)
signifie "enregistrer toutes les opérations".
Parce que sa première réponse google ...
Pour la version 3
$ mongo
MongoDB Shell version: 3.0.2
connecting to: test
> use myDb
switched to db
> db.setLogLevel(1)
http://docs.mongodb.org/manual/reference/method/db.setLogLevel/
MongoDB
possède une fonction sophistiquée de profilage. La journalisation a lieu dans la collection system.profile
. Les journaux peuvent être vus de:
db.system.profile.find()
Il y a 3 niveaux de journalisation ( source ):
Pour voir le niveau de profilage de la base de données, utilisez
db.getProfilingLevel()
et pour voir le statut
db.getProfilingStatus()
Pour changer le statut du profilage, utilisez la commande
db.setProfilingLevel(level, milliseconds)
Où level
fait référence au niveau de profilage et milliseconds
est la ms de la durée pendant laquelle les requêtes doivent être consignées. Pour désactiver la journalisation, utilisez
db.setProfilingLevel(0)
La requête à rechercher dans la collection de profils système pour toutes les requêtes ayant duré plus d'une seconde, classées par ordre chronologique décroissant, sera
db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
J'ai créé un outil de ligne de commande pour activer l'activité du profileur et voir les journaux de manière "tail" capable} _: "mongotail".
Mais la fonctionnalité la plus intéressante (également semblable à tail
) est de voir les modifications apportées à "temps réel" avec l'option -f
et de filtrer occasionnellement le résultat avec grep
pour trouver une opération particulière.
Voir la documentation et les instructions d'installation dans: https://github.com/mrsarm/mongotail
Une fois que le niveau de profilage est défini à l'aide de db.setProfilingLevel(2)
.
La commande ci-dessous imprimera la dernière requête exécutée.
Vous pouvez aussi changer la limite (5) pour voir moins/plus de requêtes.
$ nin - va filtrer les requêtes de profil et d’index
Utilisez également la requête projection {'query': 1} pour afficher uniquement le champ de requête
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
}
).limit(5).sort( { ts : -1 } ).pretty()
Journaux avec projection de requête uniquement
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()
Les données du profileur sont écrites dans une collection de votre base de données et non dans un fichier. Voir http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/
Je recommanderais d'utiliser le service MMS de 10gen et d'y alimenter les données du profileur de développement, où vous pouvez les filtrer et les trier dans l'interface utilisateur.
Je pense que bien qu’il ne soit pas élégant, le oplogpourrait être partiellement utilisé à cette fin: il enregistre toutes les écritures - mais pas les lectures ...
Vous devez activer la réplication, si j'ai raison. Les informations proviennent de cette réponse de cette question: Comment écouter les modifications apportées à une collection MongoDB?
Définir profilinglevel sur 2 est une autre option pour consigner toutes les requêtes.
Je recommande de vérifier mongosniff. Cet outil peut faire tout ce que vous voulez et plus encore. En particulier, cela peut aider à diagnostiquer les problèmes avec les systèmes mongo à grande échelle et la manière dont les requêtes sont acheminées et leur origine, car cela fonctionne en écoutant votre interface réseau pour toutes les communications liées au mongo.
db.adminCommand( { getLog: "*" } )
Ensuite
db.adminCommand( { getLog : "global" } )
J'ai écrit un script qui imprimera le journal system.profile en temps réel au fur et à mesure de l'arrivée des requêtes. Vous devez d'abord activer la journalisation, comme indiqué dans d'autres réponses. J'avais besoin de cela parce que j'utilise Windows Subsystem for Linux, pour lequel tail ne fonctionne toujours pas.
Essayez ce paquet pour gérer toutes les requêtes (sans opérations oplog): https://www.npmjs.com/package/mongo-tail-queries
(Avertissement: j'ai écrit ce paquet exactement pour ce besoin)
si vous souhaitez que les requêtes soient consignées dans le fichier journal mongodb, vous devez définir à la fois le niveau de journalisation et le profilage
db.setLogLevel(1)
db.setProfilingLevel(2)
(voir https://docs.mongodb.com/manual/reference/method/db.setLogLevel )
Si vous ne définissez que le profilage, les requêtes ne seront pas consignées dans le fichier. Vous ne pouvez donc les obtenir qu'à partir de
db.system.profile.find().pretty()