Alle Abfragen in MongoDB protokollieren

Tahseen Tauseef 15 Februar 2024
  1. den getLog-Befehl in MongoDB
  2. Ausführlichkeitsstufen für die Protokollierung von Abfragen in MongoDB
  3. Langsame Vorgänge in MongoDB protokollieren
  4. Ergebnisse der Log-Abfragen innerhalb von mongosh filtern
  5. Ergebnisse der Log-Abfragen außerhalb von mongosh mit jq filtern
Alle Abfragen in MongoDB protokollieren

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:

  1. ein totalLinesWritten-Feld, das die Anzahl der Protokollereignisse enthält;
  2. Feld log, das eine Reihe von Protokollereignissen enthält;
  3. 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:

MongoDB-Protokollabfragen – Ergebnis

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

  1. queryHash, eine Funktion, die träge Suchen mit der gleichen Abfrageform erkennen kann;
  2. 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:

  1. Bei trägem Betrieb ist die Protokollierung aktiviert.
  2. 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,

  1. Wenn durationMillis remoteOpWaitMillis überschreitet, wurde die meiste Zeit damit verbracht, auf eine Shard-Antwort zu warten. Beispielsweise sind durationMillis von 18 und remoteOpWaitMillis von 15 akzeptable Werte.
  2. Wenn durationMillis deutlich größer als remoteOpWaitMillis ist, wurde die meiste Zeit für die Zusammenführung aufgewendet. Beispiel: durationMillis von 150 und remoteOpWaitMillis von 15.

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:

MongoDB-Protokollabfragen – Ergebnis 1

Verwandter Artikel - MongoDB Query