it-swarm.com.de

MongoDB protokolliert alle Abfragen

Die Frage ist so einfach wie einfach ... Wie protokolliert man alle Abfragen in einer "tail" -fähigen Protokolldatei in Mongodb?

Ich habe versucht:

  • einstellen der Profilierungsstufe 
  • einstellen des langsamen ms-Parameters
  • mongod mit der Option -vv

Das Verzeichnis /var/log/mongodb/mongodb.log zeigt immer nur die aktuelle Anzahl der aktiven Verbindungen an ...

137

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
76

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

220
Kristof Dombi

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/

30
barak

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

  • Level 0 - Der Profiler ist deaktiviert und erfasst keine Daten. mongod schreibt immer Operationen, die länger als der slowOpThresholdMs-Schwellenwert sind, in sein Protokoll. Dies ist die Standard-Profiler-Ebene.
  • Level 1 - sammelt Profilierungsdaten nur für langsame Vorgänge. Standardmäßig sind langsame Vorgänge langsamer als 100 Millisekunden. Sie können den Schwellenwert für "langsame" Vorgänge mit der Laufzeitoption "slowOpThresholdMs" oder dem Befehl "setParameter" ändern. Weitere Informationen finden Sie im Abschnitt Festlegen des Schwellenwerts für langsame Vorgänge.
  • Level 2 - sammelt Profilierungsdaten für alle Datenbankoperationen.

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

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

19
Mariano Ruiz

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

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.

7
Hans N. Hjort

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?

4
ppeterka

Das Festlegen des Profileinzelgrades auf 2 ist eine weitere Option zum Protokollieren aller Abfragen.

4
Shnkc

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.

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

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

Dann

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

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.

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

1
user3413723

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)

0
dmchk

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