Alle Abfragen in MongoDB protokollieren
-
den
getLog
-Befehl in MongoDB - Ausführlichkeitsstufen für die Protokollierung von Abfragen in MongoDB
- Langsame Vorgänge in MongoDB protokollieren
-
Ergebnisse der Log-Abfragen innerhalb von
mongosh
filtern -
Ergebnisse der Log-Abfragen außerhalb von
mongosh
mitjq
filtern
In diesem Artikel erfahren Sie, wie Sie Abfragen in MongoDB protokollieren. Darüber hinaus werden Operatoren, die zum Protokollieren von Abfragen in MongoDB verwendet werden, ausführlich erläutert.
den getLog
-Befehl in MongoDB
Der Administratorbefehl getLog
ruft die letzten 1024 protokollierten mongod
-Vorkommen ab. Der Befehl getLog
ruft keine Protokolldaten aus der Protokolldatei mongod
ab; Stattdessen erhält es Informationen aus einem RAM-Cache von protokollierten mongod
-Ereignissen.
Verwenden Sie die Funktion db.adminCommand()
, um getLog
auszuführen. getLog
liefert ab MongoDB 4.4 Protokolldaten im Escape-Format Relaxed Extended JSON v2.0. Protokolldaten wurden bisher im Klartext geliefert.
Die Syntax für den Befehl getLog
lautet wie folgt:
db.adminCommand( { getLog: <value> } )
Die möglichen Werte für getLog
sind:
Wert | Beschreibung |
---|---|
* |
Gibt eine Liste der verfügbaren Werte für den Befehl getLog zurück. |
global |
Gibt die kombinierte Ausgabe aller Protokolleinträge zurück. |
startupwarnings |
Gibt Protokolleinträge aus dem Protokoll von MongoDB zurück, die Fehler oder Warnungen enthalten können, wenn der aktuelle Prozess gestartet wurde. Dieser Filter könnte ein leeres Array zurückgeben, wenn mongod ohne Zeichen gestartet wurde. |
Wenn *
angegeben wird, gibt der Befehl ein Dokument zurück, das die Namen der anderen gültigen Werte enthält. Andernfalls erzeugt der Befehl ein Dokument mit den folgenden Feldern:
- ein
totalLinesWritten
-Feld, das die Anzahl der Protokollereignisse enthält; - Feld
log
, das eine Reihe von Protokollereignissen enthält; - ein Antwortdokument mit Status- und Zeitstempelinformationen von
db.adminCommand()
.
Verhalten beim Abschneiden von Zeilen des getLog
-Befehls in MongoDB
Ab MongoDB 4.2 kürzt getLog
alle Ereignisse mit mehr als 1024 Zeichen. In früheren Versionen wurde es nach 512 Zeichen abgeschnitten.
Character Evasion Behavior des getLog
-Befehls in MongoDB
Ab MongoDB 4.4 liefert getLog
Protokolldaten im Escape-Format Relaxed Extended JSON v2.0, wobei die unten aufgeführten Escape-Sequenzen verwendet werden, um die Protokollausgabe in gültiges JSON umzuwandeln:
Charakter vertreten | Fluchtabfolge |
---|---|
Backslash (\ ) |
\\ |
Anführungszeichen (""") | \" |
Formularvorschub (0x0C ) |
\f |
Rücktaste (0x08 ) |
\b |
Wagenrücklauf (0x0D ) |
\r |
Horizontaler Tabulator (0x09 ) |
\t |
Zeilenumbruch (0x0A ) |
\n |
Steuerzeichen, die oben nicht erwähnt wurden, werden mit uXXXX,
maskiert, wobei XXXX
der hexadezimale Codepunkt für den Unicode-Codepunkt ist. Bytes mit falscher UTF-8-Kodierung werden durch das Unicode-Ersatzzeichen ufffd
ersetzt.
Ausführlichkeitsstufen für die Protokollierung von Abfragen in MongoDB
Sie können die Ausführlichkeitsstufe der Protokollierung ändern, um die Anzahl der von MongoDB erzeugten Protokollmeldungen zu erhöhen oder zu verringern. Die Ausführlichkeit kann für alle Komponenten gemeinsam modifiziert oder Komponenten separat identifiziert werden.
Nur Protokolleinträge in den Schweregradkategorien Informational und Debug sind von der Ausführlichkeit betroffen. Oberhalb dieser Ebenen werden immer die Schweregradkategorien angezeigt.
Setzen Sie die Ausführlichkeitseinstellungen auf einen hohen Wert für umfangreiche Protokollierung während des Debuggens oder der Entwicklung oder auf einen niedrigen Wert, um Protokollschreibvorgänge in einer validierten Produktionsbereitstellung zu begrenzen.
Untersuchen Sie die aktuelle Protokollausführlichkeitsstufe in MongoDB
Verwenden Sie die Funktion db.getLogComponents()
, um die aktuellen Ausführlichkeitsstufen anzuzeigen:
db.getLogComponents()
Ihre Ausgabe könnte wie folgt aussehen:
Der erste Eintrag, Ausführlichkeit
, ist die globale Ausführlichkeitsstufe für alle Komponenten. Die nachfolgend benannten Komponenten, wie z. B. accessControl,
, geben die spezifische Ausführlichkeitsstufe für diese Komponente an und überschreiben die globale Ausführlichkeitsstufe, falls festgelegt.
Ein Wert von -1
zeigt, dass die Komponente die Ausführlichkeitsstufe des Elternteils erbt, wenn sie eine der globalen Ausführlichkeitsstufen hat, wenn nicht (wie bei Befehl
).
Konfigurieren Sie die Protokollausführlichkeitsstufen in MongoDB
systemLog.verbosity
und systemLog.component.name>.verbosity
setzen das logComponentVerbosity
-Argument, und die db.setLogLevel()
-Funktion kann alle verwendet werden, um den Grad der Ausführlichkeit zu ändern.
Verwenden Sie die systemLog
-Ausführlichkeitseinstellungen, um den Pegel zu steuern
Verwenden Sie den Parameter systemLog.verbosity
, um die Standardprotokollebene für alle Komponenten festzulegen. Verwenden Sie die Einstellungen systemLog.component.name>.verbosity
, um den Pegel bestimmter Komponenten zu steuern.
Die folgende Konfiguration setzt beispielsweise systemLog.verbosity
auf 1
, systemLog.component.query.verbosity
auf 2
, systemLog.component.storage.verbosity
auf 2
und systemLog. component.storage.journal.ausführlichkeit
auf 1
:
systemLog:
verbosity: 1
component:
query:
verbosity: 2
storage:
verbosity: 2
journal:
verbosity: 1
Geben Sie diese Einstellungen für Ihre Instanz mongod
oder mongos
in der Konfigurationsdatei oder in der Befehlszeile an.
Der Ausführlichkeitsgrad aller nicht explizit in der Konfiguration angegebenen Komponenten ist -1
. Es zeigt an, dass sie die Ausführlichkeitsstufe ihres Elternteils übernehmen, wenn sie eine der globalen Ausführlichkeitsstufen haben.
Ändern Sie den Parameter logComponentVerbosity
Übergeben Sie ein Dokument mit den Ausführlichkeitseinstellungen, um die Option logComponentVerbosity
zu ändern.
Der folgende Befehl ändert beispielsweise die Standardausführlichkeitsstufe auf 2
, die Abfrage
auf 3
, die Speicherung
auf 4
und die Speicherung.journal
auf 1
.
db.adminCommand( {
setParameter: 1,
logComponentVerbosity: {
verbosity: 2,
query: {
verbosity: 3
},
storage: {
verbosity: 4,
journal: {
verbosity: 1
}
}
}
} )
Sie können diese Werte von mongosh.
aus einstellen.
Verwenden Sie db.setLogLevel()
, um die Protokollebene in MongoDB zu ändern
Um den Loglevel einer einzelnen Komponente zu ändern, verwenden Sie die Funktion db.setLogLevel()
. Sie können eine Ausführlichkeitsstufe von 0
bis 5
für eine Komponente definieren oder -1
angeben, um die Ausführlichkeit der übergeordneten Komponente zu erben.
Das Festlegen von systemLog.component.query.verbosity
auf die übergeordnete Ausführlichkeit (d. h. die Standardausführlichkeit) lautet beispielsweise wie folgt:
db.setLogLevel(-1, "query")
Sie können diesen Wert von mongosh.
aus einstellen.
Langsame Vorgänge in MongoDB protokollieren
Clientvorgänge (z. B. Abfragen) werden protokolliert, wenn sie länger als der Schwellenwert für langsame Vorgänge dauern oder wenn die Ausführlichkeitsstufe des Protokolls auf 1
oder höher festgelegt ist.
Für Lese-/Schreibvorgänge ab MongoDB 4.2 umfassen die Profiler-Einträge und Diagnoseprotokollmeldungen (d. h. mongod/mongos
-Protokollmeldungen):
queryHash
, eine Funktion, die träge Suchen mit der gleichen Abfrageform erkennen kann;planCacheKey
gibt zusätzliche Informationen über den Abfrageplan-Cache für langsame Abfragen.
Protokollmeldungen zu langsamen Vorgängen enthalten jetzt eine remote
-Spalte, die die Client-IP-Adresse ab MongoDB 5.0 angibt.
Die angegebene Beispielausgabe enthält Informationen zu einem langsamen Aggregationsvorgang:
{"t":{"$date":"2020-05-20T20:10:08.731+00:00"},"s":"I", "c":"COMMAND", "id":51803, "ctx":"conn281","msg":"Slow query","attr":{"type":"command","ns":"stocks.trades","appName":"MongoDB Shell","command":{"aggregate":"trades","pipeline":[{"$project":{"ticker":1.0,"price":2.0,"priceGTE110":{"$gte":["$price",111.0]},"_id":0.0}},{"$sort":{"price":-1.0}}],"allowDiskUse":true,"cursor":{},"lsid":{"id":{"$uuid":"fa658f9e-9cd6-42d4-b1c8-c9160fabf2a2"}},"$clusterTime":{"clusterTime":{"$timestamp":{"t":1590005405,"i":1}},"signature":{"hash":{"$binary":{"base64":"AAAAAAAAAAAAAAAAAAAAAAAAAAA=","subType":"0"}},"keyId":0}},"$db":"test"},"planSummary":"COLLSCAN","cursorid":1912190691485054730,"keysExamined":0,"docsExamined":1000001,"hasSortStage":true,"usedDisk":true,"numYields":1002,"nreturned":101,"reslen":17738,"locks":{"ReplicationStateTransition":{"acquireCount":{"w":1119}},"Global":{"acquireCount":{"r":1119}},"Database":{"acquireCount":{"r":1119}},"Collection":{"acquireCount":{"r":1119}},"Mutex":{"acquireCount":{"r":117}}},"storage":{"data":{"bytesRead":232899899,"timeReadingMicros":186017},"timeWaitingMicros":{"cache":849}},"remote": "192.168.14.15:37666","protocol":"op_msg","durationMillis":22427}}
Erhalten Sie die Wartezeit für Shards im Feld remoteOpWaitMillis
Sie können die Wartezeit (in Millisekunden) für Ergebnisse von Shards mithilfe des Protokollfelds remoteOpWaitMillis
ab MongoDB 5.0 abrufen.
Für remoteOpWaitMillis
werden nur folgende Werte gemeldet:
- Bei trägem Betrieb ist die Protokollierung aktiviert.
- Auf dem Shard oder
mongos,
, der die Ergebnisse kombiniert
Vergleichen Sie die Zeitspalten durationMillis
und remoteOpWaitMillis
im Protokoll, um festzustellen, ob ein Zusammenführungsvorgang oder ein Shard-Problem die langsame Abfrage verursacht. durationMillis
ist die Gesamtzeit, die zum Beenden der Abfrage benötigt wurde.
Speziell,
- Wenn
durationMillis
remoteOpWaitMillis
überschreitet, wurde die meiste Zeit damit verbracht, auf eine Shard-Antwort zu warten. Beispielsweise sinddurationMillis
von18
undremoteOpWaitMillis
von15
akzeptable Werte. - Wenn
durationMillis
deutlich größer alsremoteOpWaitMillis
ist, wurde die meiste Zeit für die Zusammenführung aufgewendet. Beispiel:durationMillis
von150
undremoteOpWaitMillis
von15
.
Ergebnisse der Log-Abfragen innerhalb von mongosh
filtern
Die Ausgabe von getLog
kann gefiltert werden, um die Ergebnisse besser lesbar zu machen oder bestimmten Kriterien zu entsprechen.
Der folgende Befehl druckt nur das Feld log
(das ein Array aller aktuellen Log-Ereignisse enthält) und entfernt Zeichen, die aus jeder Log-Nachricht entkommen:
db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})
Bei diesem Vorgang wird die Ausgabe von getLog
im selben Format wie die Protokolldatei
von MongoDB dargestellt.
ACHTUNG: getLog
zeigt nur die letzten 1024 protokollierten mongod
-Ereignisse an und soll nicht die MongoDB-Protokolldatei ersetzen.
Ergebnisse der Log-Abfragen außerhalb von mongosh
mit jq
filtern
Das Drittanbieter-Kommandozeilenprogramm jq
ist praktisch, wenn es um die strukturierte Protokollierung von MongoDB geht. Es ermöglicht schnelles Pretty-Printing von Protokolleinträgen und robustes schlüsselbasiertes Abgleichen und Filtern.
jq
ist ein kostenloser Open-Source-JSON-Parser für Linux, Windows und macOS.
Sie müssen die Option -eval
für mongosh
verwenden, um jq
mit der getLog
-Ausgabe zu verwenden. Die folgende Aktion verwendet jq
, um die REPL-Komponente zu filtern, sodass nur Protokollmeldungen angezeigt werden, die sich auf die Replikation beziehen:
mongosh --quiet --eval "db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})" | jq -c '. | select(.c=="REPL")'
Achten Sie darauf, mongosh
alle verbindungsspezifischen Argumente zu geben, die es benötigt, wie -host
oder -port.
.
mongosh --quiet --eval "db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})" | jq -r ".msg" | sort | uniq -c | sort -rn | head -10
Rufen Sie verfügbare Protokollfilter ab
Die folgende Operation, die von mongosh
ausgeführt wird, gibt die verfügbaren Protokollfilter zur Weitergabe an getLog
zurück:
db.adminCommand( { getLog: "" } )
Die Operation gibt das folgende Dokument zurück:
{ "names" : [ "global", "startupWarnings" ], "ok" : 1 }
Abrufen der letzten Ereignisse aus dem Protokoll
Der folgende Befehl, der von mongosh
ausgeführt wird, ruft die neuesten globalen
Ereignisse von mongod
ab:
db.adminCommand( { getLog : "global" } )
Die Operation erzeugt ein Dokument, das wie folgt aussieht: