web-dev-qa-db-fra.com

MongoDB enregistre toutes les requêtes

La question est aussi fondamentale que simple ... Comment enregistrer toutes les requêtes dans un fichier journal "tail" dans mongodb?

J'ai essayé:

  • réglage du niveau de profilage 
  • réglage du paramètre ms lent à partir
  • mongod avec l'option -vv

Le /var/log/mongodb/mongodb.log continue d'afficher uniquement le nombre actuel de connexions actives ...

137

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
76

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".

220
Kristof Dombi

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/

30
barak

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 ):

  • Niveau 0 - le profileur est désactivé et ne collecte aucune donnée. mongod écrit toujours des opérations plus longues que le seuil slowOpThresholdMs dans son journal. C'est le niveau de profileur par défaut.
  • Niveau 1 - collecte les données de profilage uniquement pour les opérations lentes. Par défaut, les opérations lentes sont inférieures à 100 millisecondes . Vous pouvez modifier le seuil d'opérations «lentes» à l'aide de l'option d'exécution slowOpThresholdMs ou de la commande setParameter. Consultez la section Spécifier le seuil pour les opérations lentes pour plus d'informations.
  • Niveau 2 - collecte des données de profilage pour toutes les opérations de base de données.

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)

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 } )
21
student

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

19
Mariano Ruiz

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()
8

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.

7
Hans N. Hjort

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?

4
ppeterka

Définir profilinglevel sur 2 est une autre option pour consigner toutes les requêtes.

4
Shnkc

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.

http://docs.mongodb.org/v2.2/reference/mongosniff/

3
Daniel Williams
db.adminCommand( { getLog: "*" } )

Ensuite

db.adminCommand( { getLog : "global" } )
1
HareesH P

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.

https://github.com/dtruel/mongo-live-logger

1
user3413723

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)

0
dmchk

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()
0
DariusNica