Die Frage ist so einfach wie einfach ... Wie protokolliert man alle Abfragen in einer "tail" -fähigen Protokolldatei in Mongodb?
Ich habe versucht:
Das Verzeichnis /var/log/mongodb/mongodb.log zeigt immer nur die aktuelle Anzahl der aktiven Verbindungen an ...
Am Ende habe ich das Problem gelöst, indem ich mongod so angefangen habe (gehämmert und hässlich, ja ... aber funktioniert für die Entwicklungsumgebung):
mongod --profile=1 --slowms=1 &
Dadurch wird die Profilerstellung aktiviert und der Schwellenwert für "langsame Abfragen" auf 1 ms festgelegt. Dadurch werden alle Abfragen als "langsame Abfragen" in der Datei protokolliert:
/var/log/mongodb/mongodb.log
Jetzt bekomme ich fortlaufende Protokollausgaben mit dem Befehl:
tail -f /var/log/mongodb/mongodb.log
Ein Beispielprotokoll:
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
Sie können alle Abfragen protokollieren:
$ 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()
Quelle: http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/
db.setProfilingLevel(2)
bedeutet "alle Vorgänge protokollieren".
Weil es die erste Antwort von Google ist ...
Für 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
verfügt über ein ausgeklügeltes Merkmal der Profilerstellung. Die Protokollierung erfolgt in system.profile
collection. Die Protokolle sind zu sehen von:
db.system.profile.find()
Es gibt 3 Protokollierungsstufen ( source ):
Um herauszufinden, auf welcher Profiling-Ebene die Datenbank ausgeführt wird, verwenden Sie
db.getProfilingLevel()
und um den Status zu sehen
db.getProfilingStatus()
Verwenden Sie den Befehl, um den Profilierungsstatus zu ändern
db.setProfilingLevel(level, milliseconds)
Dabei bezieht sich level
auf die Profiling-Ebene und milliseconds
ist die ms, für die die Abfragen protokolliert werden müssen. Um die Protokollierung zu deaktivieren, verwenden Sie
db.setProfilingLevel(0)
Die Abfrage, die in der Systemprofilsammlung nach allen Abfragen gesucht werden soll, die länger als eine Sekunde gedauert haben, wird nach absteigendem Zeitstempel sortiert
db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
Ich habe ein Befehlszeilentool erstellt, um die Profiler-Aktivität zu aktivieren und die Protokolle in einer "tail" - fähigen Weise zu sehen: "mongotail".
Das interessantere Feature (auch wie tail
) besteht jedoch darin, die Änderungen in "Echtzeit" mit der -f
-Option anzuzeigen und das Ergebnis gelegentlich mit grep
zu filtern, um eine bestimmte Operation zu finden.
Dokumentation und Installationsanweisungen finden Sie unter: https://github.com/mrsarm/mongotail
Sobald die Profilierungsstufe mit db.setProfilingLevel(2)
eingestellt ist.
Der folgende Befehl gibt die zuletzt ausgeführte Abfrage aus.
Sie können auch das Limit (5) ändern, um weniger/mehr Abfragen anzuzeigen.
$ nin - filtert Profil- und Indexabfragen heraus
Verwenden Sie auch die Abfrageprojektion {'query': 1}, um nur das Abfragefeld anzuzeigen
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
}
).limit(5).sort( { ts : -1 } ).pretty()
Protokolle nur mit Abfrageprojektion
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()
Die Profiler-Daten werden in eine Sammlung in Ihrer Datenbank geschrieben, nicht in eine Datei. Siehe http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/
Ich würde die Verwendung des Dienstes "10gen's MMS " empfehlen und die Daten des Entwicklungsprofilers dort einspeisen, wo Sie sie in der Benutzeroberfläche filtern und sortieren können.
Ich denke, dass, obwohl nicht elegant, der oplogkönnte teilweise für diesen Zweck verwendet werden: Er protokolliert alle Schreibvorgänge - aber nicht die Lesevorgänge ...
Sie müssen Replikate aktivieren, wenn ich Recht habe. Die Informationen stammen aus dieser Antwort aus dieser Frage: Wie kann ich auf Änderungen an einer MongoDB-Sammlung achten?
Das Festlegen des Profileinzelgrades auf 2 ist eine weitere Option zum Protokollieren aller Abfragen.
Ich empfehle Mongosniff. Dieses Dosenwerkzeug kann alles, was Sie wollen und noch mehr. Insbesondere kann es helfen, Probleme mit größeren Mongo-Systemen zu diagnostizieren und zu ermitteln, wie Abfragen geleitet werden und woher sie kommen, da dies funktioniert, indem Sie Ihre Netzwerkschnittstelle für alle mit dem Mongo verbundenen Kommunikation abhören.
db.adminCommand( { getLog: "*" } )
Dann
db.adminCommand( { getLog : "global" } )
Ich habe ein Skript geschrieben, das das system.profile-Protokoll in Echtzeit druckt, sobald Abfragen eingehen. Sie müssen die Protokollierung zuerst aktivieren, wie in den anderen Antworten angegeben. Ich brauchte das, weil ich Windows Subsystem für Linux verwende, für das tail immer noch nicht funktioniert.
Probieren Sie dieses Paket aus, um alle Abfragen zu beenden (ohne Oplog-Operationen): https://www.npmjs.com/package/mongo-tail-queries
(Haftungsausschluss: Ich habe dieses Paket genau für diesen Bedarf geschrieben)
wenn Sie möchten, dass die Abfragen in der mongodb-Protokolldatei protokolliert werden, müssen Sie sowohl die Protokollstufe als auch die Protokollebene und die Profilerstellung festlegen. Beispiel:
db.setLogLevel(1)
db.setProfilingLevel(2)
(Siehe https://docs.mongodb.com/manual/reference/method/db.setLogLevel )
Wenn Sie nur die Profilerstellung festlegen, werden die Abfragen nicht in einer Datei protokolliert, sodass Sie diese nur abrufen können
db.system.profile.find().pretty()