Erweiterte Logabfragen

In diesem Leitfaden erfahren Sie, wie Sie mit der Legacy-Loganzeige erweiterte Logabfragen erstellen. Das sind Ausdrücke, die eine Reihe von Logeinträgen aus beliebig vielen Logs angeben können. Erweiterte Logabfragen können verwendet werden in derLegacy-Loganzeige, denLogging-API odergcloud Befehlszeilentool , um die Option zu aktivieren.

Einfachere Abfrageoptionen finden Sie unter Einfache Logabfragen.

Eine Liste der empfohlenen Abfragen zum Suchen nach Logs finden Sie unter Beispielabfragen.

Einführung

Cloud Logging bietet zwei Schnittstellen zum Analysieren von Logdaten:

Diese Seite enthält Informationen zur Verwendung der Legacy-Loganzeige zum Schreiben erweiterter Abfragen. Der Log-Explorer ist die neue Oberfläche zum Analysieren von Logdaten. Weitere Informationen zum Log-Explorer finden Sie unter Log-Explorer verwenden.

Eine erweiterte Logabfrage ist ein boolescher Ausdruck, der eine Teilmenge aller Logeinträge in Ihrem Projekt angibt. Sie können damit die folgenden Aufgaben ausführen:

  • Logeinträge aus bestimmten Logs oder Logdiensten auswählen
  • Logeinträge innerhalb eines Zeitraums auswählen
  • Logeinträge auswählen, die Bedingungen für Metadaten oder benutzerdefinierte Felder erfüllen
  • Einen Prozentsatz aller Logeinträge als Stichprobe auswählen

Erste Schritte mit erweiterten Logabfragen

So verwenden Sie erweiterte Logabfragen in der Legacy-Loganzeige:

  1. Rufen Sie in der Cloud Console die Seite Logging > Log-Explorer auf.

  2. Wählen Sie im Drop-down-Menü Options (Optionen) die Option Go to the Legacy Logs Viewer (Zurück zur Legacy-Loganzeige) aus.

    Wählen Sie "Zurück zur Legacy-Loganzeige" aus.

  3. Wählen Sie oben auf der Seite ein vorhandenes Google Cloud-Projekt aus oder erstellen Sie ein neues Projekt.

  4. Wählen Sie im Drop-down-Menü die Ressource aus, deren Logs Sie aufrufen möchten.

  5. Klicken Sie auf das Drop-down-Menü im Suchfeld und wählen Sie In erweiterten Filter umwandeln aus.

Benutzeroberfläche mit der Umwandlung zum erweiterten Filter

Logabfragen werden auf der Benutzeroberfläche als "Filter" gekennzeichnet, da sie die Auswahl bestimmter Logeinträge ermöglichen.

Die Oberfläche für erweiterte Logabfragen wird angezeigt:

Auf der Benutzeroberfläche werden Optionen für erweiterte Filter gezeigt.

Sie können diese Abfrageoberfläche an den fehlenden Menüs für die Logauswahl und an der Schaltfläche Filter senden erkennen. In der Legacy-Loganzeige werden Logeinträge angezeigt, die alle in der Abfrage angegebenen Bedingungen erfüllen.

Es folgt ein einfaches Beispiel für eine erweiterte Logabfrage:

    resource.type = "gce_instance" AND
    severity >= ERROR AND
    NOT textPayload:robot

Diese Abfrage erfasst Logeinträge von Compute Engine, die mindestens den Schweregrad ERROR haben und deren Feld textPayload nicht den String robot enthält. Stringvergleiche unterscheiden nicht zwischen Groß- und Kleinschreibung. Die Namen resource, severity und textPayload werden im Typ LogEntry definiert.

Abfragelänge: Die Länge einer Abfrage darf 20.000 Zeichen nicht überschreiten.

Vorschläge und Markierungen während der Eingabe: Wenn Sie eine erweiterte Logabfrage in die Legacy-Loganzeige eingeben, werden unter Umständen Vorschläge für bestimmte Logeintragsfelder angezeigt. Die Vorschläge stammen sowohl aus der Filtersprache als auch aus den tatsächlich in der Legacy-Loganzeige geladenen Log-Einträgen. Drücken Sie TAB, um einen Vorschlag auszuwählen. Falls keine Vorschläge angezeigt werden, drücken Sie CTRL + SPACE. Die verschiedenen Teile eines Abfrageausdrucks sind farblich hervorgehoben. Ein rot markierter Ausdruck weist darauf hin, dass die bisher eingegebene Abfrage unter Umständen einen Fehler enthält oder unvollständig ist.

Text ohne Anführungszeichen: Textstrings, die weder Leerzeichen noch bestimmte Sonderzeichen enthalten, können Sie ohne Anführungszeichen eingeben. Das wird als Text ohne Anführungszeichen bezeichnet. Beispiele hierfür sind die oben angegebenen Begriffe ERROR und robot. Der String "v1.compute.instances.insert" ist aufgrund der enthaltenen Punkte in Anführungszeichen gesetzt. Wenn Sie in einen String Anführungszeichen einbeziehen möchten, stellen Sie den Anführungszeichen einen umgekehrten Schrägstrich voran.

Best Practice: Setzen Sie Strings, die Sie mit Feldwerten vergleichen, in Anführungszeichen. Sie vermeiden dadurch eine versehentliche Änderung der Bedeutung eines Vergleichs. Derartige Fehler lassen sich mitunter nur schwer ermitteln und beheben. Sie können die Anführungszeichen bei Begriffen weglassen, die aus einem Buchstaben gefolgt von einer Reihe von Buchstaben, Ziffern oder Unterstrichen (_) bestehen.

Über die Tastatur: Wenn Sie eine Tastatur zum Eingeben einer erweiterten Logabfrage in das Suchanfragefeld verwenden, können Sie durch Drücken von ESC den Bearbeitungsmodus verlassen und dann Drücken Sie TAB, um zu den anderen Optionen zu gelangen, z. B. zum Drop-down-Menü oder zur Schaltfläche Filter senden.

Abfragesyntax für erweiterte Abfragen

In diesem Abschnitt wird die Struktur der erweiterten Abfragen erläutert. Darüber hinaus wird gezeigt, wie Vergleiche durchgeführt werden.

Syntaxnotation

Die Syntax der erweiterten Logabfrage lässt sich mithilfe der folgenden Notation beschreiben:

  • a = e bedeutet, dass a ein Name für den Ausdruck e ist.
  • a b bedeutet "a gefolgt von b".
  • a | b steht für a oder b.
  • ( e ) wird für Gruppierungen verwendet.
  • [ e ] bedeutet, dass e optional ist.
  • { e } bedeutet, dass e nicht oder mehrere Male wiederholt werden kann.
  • "abc" bedeutet, dass abc wie vorgegeben enthalten sein muss.

Zusammenfassung zur Syntax

In diesem Abschnitt erhalten Sie einen Überblick über die Syntax der Sprache.

Eine Abfrage ist ein String mit einem Ausdruck:

   expression = ["NOT"] comparison { ("AND" | "OR") ["NOT"] comparison }

Ein Vergleich ist entweder ein einzelner Wert oder ein boolescher Ausdruck:

  "The cat in the hat"
  resource.type = "gae_app"

Die erste Zeile enthält ein Beispiel für einen Vergleich mit einem einzelnen Wert. Diese Vergleichstypen sind globale Beschränkungen. Jedes Feld eines Logeintrags wird mit dem Wert unter impliziter Verwendung des Operators has verglichen. Wenn in diesem Beispiel ein Feld in einem LogEntry oder in seiner Nutzlast den Ausdruck "The cat in the hat" enthält, ist der Vergleich erfolgreich.

Die zweite Zeile enthält ein Beispiel für einen Vergleich mit einem booleschen Ausdruck des Formats [FIELD_NAME] [OP] [VALUE]. Die Elemente des Vergleichs sind nachfolgend beschrieben:

  • [FIELD_NAME]: ist ein Feld in einem Logeintrag. Beispiel: resource.type

  • [OP]: ist ein Vergleichsoperator. Beispiel: =

  • [VALUE]: ist eine Zahl, ein String, eine Funktion oder ein Ausdruck in Klammern. Beispiel: "gae_app". Verwenden Sie für JSON-Nullwerte NULL_VALUE.

In den folgenden Abschnitten werden Abfragen und der Abgleich ausführlich erläutert.

Boolesche Operatoren

Die booleschen Operatoren AND und OR sind Kurzschlussoperatoren. Die höchste Priorität hat der Operator NOT, gefolgt von OR und AND – in dieser Reihenfolge. Die beiden folgenden Ausdrücke sind beispielsweise gleichwertig:

a OR NOT b AND NOT c OR d
(a OR (NOT b)) AND ((NOT c) OR d)

Sie können den Operator AND zwischen Vergleichen auslassen. Sie können statt des Operators NOT auch den Operator - (Minuszeichen) verwenden. Die folgenden beiden Abfragen sind beispielsweise identisch:

a=b AND c=d AND NOT e=f
a=b c=d -e=f

In dieser Dokumentation werden immer AND und NOT verwendet.

Vergleiche

Vergleiche haben folgende Form:

[FIELD_NAME] [OP] [VALUE]

Die Elemente des Vergleichs sind nachfolgend beschrieben:

  • [FIELD_NAME]: ist der Pfadname eines Felds in einem Logeintrag. Beispiele für den Feldnamen sind:

    resource.type
    resource.labels.zone
    resource.labels.project_id
    insertId
    jsonPayload.httpRequest.protocol
    labels."compute.googleapis.com/resource_id"
    

    Wenn eine Komponente eines Pfadnamens Sonderzeichen enthält, muss der Pfadname in doppelten Anführungszeichen stehen. Beispiel: compute.googleapis.com/resource_id muss in Anführungszeichen gesetzt werden, da es einen Schrägstrich / enthält.

    Weitere Informationen erhalten Sie auf dieser Seite unter Feldpfadkennzeichnungen.

  • [OP]: ist einer dieser Vergleichsoperatoren:

    =           # equal
    !=          # not equal
    > < >= <=   # numeric ordering
    :           # "has" matches any substring in the log entry field
    =~          # regular expression search for a pattern
    !~          # regular expression search not for a pattern
    
  • [VALUE]: ist eine Zahl, ein String, eine Funktion oder ein Ausdruck in Klammern. Strings stellen beliebigen Text sowie boolesche, Aufzählungs- und Bytestring-Werte dar. [VALUE] wird vor dem Vergleich in den Feldtyp konvertiert. Verwenden Sie für JSON-Nullwerte NULL_VALUE.

Verwenden Sie die folgende Syntax, um nach einem JSON-Nullwert zu filtern:

    jsonPayload.field = NULL_VALUE      # includes "field" with null value
    NOT jsonPayload.field = NULL_VALUE  # excludes "field" with null value

Wenn es sich bei [VALUE] um eine in Klammern gesetzte boolesche Kombination von Vergleichen handelt, werden der Feldname und der Vergleichsoperator auf jedes der Elemente angewendet. Beispiel:

    jsonPayload.cat = ("longhair" OR "shorthair")
    jsonPayload.animal : ("nice" AND "pet")

Der erste Vergleich prüft, ob das Feld cat den Wert "longhair" oder "shorthair" enthält. Der zweite Vergleich prüft, ob der Wert des Felds animal die Wörter "nice" und "pet" in beliebiger Reihenfolge enthält.

Feldpfadkennzeichnungen

Alle Logeinträge sind Instanzen des Typs LogEntry. Die Kennzeichnung, also die linke Seite des Vergleichs (oder deren Beginn), muss ein im Typ LogEntry definiertes Feld sein. Details zu den möglichen Kennzeichnungen und ihren Werten finden Sie im Abschnitt zum Typ "LogEntry".

Hier finden Sie die aktuelle Liste der Logeintragsfelder. Auf jedes Feld folgt gegebenenfalls die nächste Namensebene für dieses Feld:

  • httpRequest: { cacheFillBytes, cacheHit, cacheLookup, cacheValidatedWithOriginServer, latency, protocol, referer, remoteIp, requestMethod, requestSize, requestUrl, responseSize, serverIp, status, userAgent }
  • insertId
  • jsonPayload { variable }
  • labels { variable }
  • logName
  • metadata { systemLabels, userLabels }
  • operation{ id, producer, first, last }
  • protoPayload { @type, variable }
  • receiveTimestamp
  • resource { type, labels }
  • severity
  • sourceLocation: { file, line, function }
  • spanId
  • textPayload
  • timestamp
  • trace

Unten sehen Sie Beispiele für Feldpfadkennzeichnungen, die Sie in Ihren Vergleichen verwenden können:

  • resource.type: Wenn die erste Pfadkennzeichnung resource ist, muss die nächste Kennzeichnung ein Feld vom Typ MonitoredResource sein.

  • httpRequest.latency: Wenn die erste Pfadkennzeichnung httpRequest ist, muss die nächste Kennzeichnung ein Feld vom Typ HttpRequest sein.

  • labels.[KEY] Wenn die erste Pfadkennzeichnung labels ist, muss die nächste Kennzeichnung [KEY] einer der Schlüssel aus den Schlüssel/Wert-Paaren sein, die im Feld labels angezeigt werden.

  • logName: Da das Feld logName ein String ist, kann kein Name eines Unterfelds folgen.

Wenn Sie die Felder map oder struct abfragen, müssen Sie die Groß- und Kleinschreibung des jeweiligen Schlüssels sowie die Formatierung im Ausdruck beibehalten.

Beispiel: jsonPayload ist ein STRUCT-Feld. Ein in jsonPayload verschachtelter Feldname wie jsonPayload.end_time unterscheidet sich also von jsonPayload.endTime. Für ein Kartenfeld wie labels unterscheidet sich der Labelschlüssel labels.env_name von labels.envName. Im Gegensatz dazu müssen Sie beim Abfragen des regulären Protokollpufferfelds protoPayload die Groß- und Kleinschreibung nicht berücksichtigen.

Informationen zu den Feldtypen LogEntry finden Sie in der Referenz zu google.logging.v2.

Sonderzeichen

Wenn das Feld LogEntry Sonderzeichen enthält, muss das Logfeld in Anführungszeichen gesetzt werden. Beispiel:

  jsonPayload.":name":apple

  jsonPayload."foo.bar":apple

  jsonPayload."\"foo\"":apple

Eine Liste der Sonderzeichen finden Sie im Abschnitt string unter Werte und Konversionen.

Weitere Informationen zur Verwendung von Feldpfadkennzeichnungen, die auf Objekte oder Arrays verweisen, finden Sie auf dieser Seite unter Objekt- und Arraytypen.

Überwachte Ressourcentypen

Zum Beschleunigen von Abfragen geben Sie den Typ für eine überwachte Ressource an. Eine Liste der Ressourcentypen finden Sie unter Überwachte Ressourcen und Dienste.

Für Compute Engine-VMs wird z. B. der Ressourcentyp gce_instance und für Amazon EC2-Instanzen der Typ aws_ec2_instance verwendet. Im folgenden Beispiel wird gezeigt, wie Sie Abfragen auf beide Arten von VMs beschränken können:

    resource.type = ("gce_instance" OR "aws_ec2_instance")

Die Werte überwachter Ressourcentypen in Logs sind indexiert. Durch den Abgleich mit Teilstrings verlangsamen sich die Abfragen.

Fehlende Felder

Wenn Sie in einer Abfrage einen Feldnamen verwenden und das Feld nicht in einem Logeintrag enthalten ist, gilt das Feld so:Fehlt .Nicht definiert oderStandard :

  • Wenn das Feld Teil der Nutzlast (jsonPayload oder protoPayload) des Logeintrags ist oder im Abschnitt labels des Logeintrags in einem Label enthalten ist, gilt es als fehlend. Wenn Sie ein fehlendes Feld verwenden, wird zwar keine Fehlermeldung ausgegeben, aber alle Vergleiche, die fehlende Felder verwenden, schlagen ohne Rückmeldung fehl.

    Beispiele: jsonPayload.nearest_store, protoPayload.name.nickname

  • Wenn das Feld im Typ LogEntry definiert ist, gilt das Feld als standardmäßig. Vergleiche werden durchgeführt, als wäre das Feld vorhanden und hätte seinen Standardwert.

    Beispiele: httpRequest.remoteIp, trace, operation.producer

  • Andernfalls gilt das Feld als nicht definiert, was ein Fehler ist, der vor der Verwendung der Abfrage erkannt wird.

    Beispiele: thud, operation.thud, textPayload.thud

Verwenden Sie zum Testen, ob ein fehlendes oder standardmäßiges Feld vorhanden ist, ohne jedoch einen bestimmten Wert in dem Feld zu testen, den Vergleich :*. Der folgende Vergleich ist beispielsweise erfolgreich, wenn das Feld operation.id explizit in einem Logeintrag vorhanden ist:

operation.id:*

Beachten Sie das Verhalten der folgenden Abfragen:

  • Wenn Sie den booleschen Operator NOT für ein fehlendes Feld verwenden, lautet das Ergebnis TRUE:

    # Returns TRUE
    NOT missingField=foo
    
  • Wenn Sie den Vergleichsoperator != für ein fehlendes Feld nutzen, lautet das Ergebnis FALSE:

    # Returns FALSE
    missingField!=foo
    

Objekt- und Arraytypen

Jedes Logeintragsfeld kann einen Skalar, ein Objekt oder ein Array enthalten.

  • Ein Skalarfeld speichert einen einzelnen Wert wie 174.4 oder -1. Ein string wird auch als Skalar betrachtet. Felder, die in einen (oder aus einem) String konvertiert werden können (z. B. Duration und Timestamp) enthalten ebenfalls skalare Typen.

  • Ein Objekttyp speichert eine Sammlung von benannten Werten wie den folgenden JSON-Wert:

    {"age": 24, "height": 67}
    

    Sie können auf den Wert innerhalb eines Objekts verweisen. Wenn beispielsweise jsonPayload.x den obigen Wert enthält, hat jsonPayload.x.age den Wert 24.

  • Ein Arrayfeld speichert eine Liste von Werten – alle vom selben Typ. Zum Beispiel könnte ein Feld mit Messungen ein Array von Zahlen haben:

    {8.5, 9, 6}
    

    Wenn Vergleiche durchgeführt werden und [FIELD_NAME] ein Arrayfeld ist, wird jedes Element des Arrays mit [VALUE] verglichen und die Ergebnisse werden mit dem Operator OR miteinander verbunden. Wenn z. B. jsonPayload.shoeSize ein Arrayfeld ist, in dem {8.5, 9, 6} gespeichert ist, ist der Vergleich:

    jsonPayload.shoeSize < 7
    

    äquivalent zu:

    8.5 < 7 OR 9 < 7 OR 6 < 7
    

    In diesem Beispiel wird der Gesamtvergleich als erfolgreich ausgewertet.

Werte und Umwandlungen

Zur Bewertung eines Vergleichs wird zuerst der Wert auf der rechten Seite in den Typ des Logeintragsfelds umgewandelt. Skalare Feldtypen sind in Vergleichen zusammen mit den beiden zusätzlichen Typen Duration und Timestamp erlaubt. Ihre Werte werden als Strings dargestellt. Die skalaren Typen sind in der Liste der skalaren Protokollpuffertypen zu finden. In der folgenden Tabelle wird erläutert, welche Werte in Logfeldtypen umgewandelt werden können:

Feldtyp Zulässiger Abfragewert
bool

"True" oder "false" unabhängig von der Groß- oder Kleinschreibung. Beispiele: "True", "true"

bytes

Ein String mit einer beliebigen Bytefolge. Beispiel: "\377\377"

Duration

Ein String mit einer vorzeichenbehafteten Dezimalzahl gefolgt von einer der Einheiten "ns", "us", "ms", "s", "m" oder "h". Die Dauer wird auf die Nanosekunde genau angegeben. Beispiel: "3.2s"

enum

Der Name eines Aufzählungstypliterals unabhängig von Groß- und Kleinschreibung. Beispiel: "WARNING" ist ein Wert vom Typ LogSeverity.

double

Eine beliebige Zahl mit oder ohne Vorzeichen und mit einem Exponenten oder die speziellen Wertstrings "NaN", "-Infinity" und "Infinity" unabhängig von der Groß- oder Kleinschreibung. Beispiele: "-3.2e-8", "nan"

intNN

Eine vorzeichenbehaftete Ganzzahl innerhalb der Größe des Typs. Beispiel: "-3"

string

Ein String mit UTF-8-codiertem oder 7-Bit-ASCII-Text. Eingebetteten Anführungszeichen muss als Escapezeichen ein umgekehrter Schrägstrich vorangestellt werden.

Stringwerte müssen in Anführungszeichen gesetzt werden, um folgende Sonderzeichen zu maskieren:

  • Strings, die mit + (plus), - (minus) oder . (Punkt) beginnen.

  • Strings mit ~ (Tilde), = (gleich), () (Klammern), : (Doppelpunkt), > (größer als), < (kleiner als), , (Komma) oder . (Punkt).

  • Beliebige Escape-Sequenz, z. B. \t.

Timestamp

Ein String im Format RFC 3339 oder ISO 8601. Beispiele: "2014-10-02T15:01:23.045Z" (RFC 3339), "2014-10-02" (ISO 8601). In Abfrageausdrücken können Sie mithilfe von Zeitstempeln im Format RFC 3339 eine Zeitzone mit "Z" oder ±hh:mm angeben. Zeitstempel werden auf die Nanosekunde genau dargestellt.

uintNN

Eine nicht vorzeichenbehaftete Ganzzahl innerhalb der Größe des Typs. Beispiel: "1234"

Wenn bei der Umwandlung ein Fehler auftritt, schlägt auch der Vergleich fehl.

Wenn für eine Umwandlung ein String erforderlich ist, können Sie eine Zahl oder einen Text ohne Anführungszeichen verwenden, sofern darin keine Sonderzeichen wie Leerzeichen oder Operatoren enthalten sind. Ebenso können Sie bei einer Umwandlung, die eine Zahl erfordert, einen aus einer Zahl bestehenden String verwenden.

Die Typen intNN und uintNN stellen Ganzzahltypen unterschiedlicher Größe wie int32 und uint64 dar. Wenn ein Wert in einen 64-Bit-Ganzzahltyp umgewandelt werden soll, muss er als String geschrieben werden, z. B. "9223372036854775807".

Typen von Logfeldern

Der Typ eines Logeintragsfelds wird so festgelegt:

  • Logfelder, die im Typ LogEntry und im Komponententyp definiert sind, sind Protokollpufferfelder. Protokollpufferfelder haben explizite Typen.

  • Zum Objekttyp protoPayload gehörende Logfelder sind ebenfalls Protokollpufferfelder und haben explizite Typen. Der Name des Protokollpuffertyps ist im Feld "@type" von protoPayload gespeichert. Weitere Informationen erhalten Sie im Abschnitt zur JSON-Zuordnung.

  • Die Typen der Logfelder innerhalb von jsonPayload werden beim Empfang des Logeintrags vom Wert des Felds abgeleitet:

    • Felder, die als Werte Zahlen ohne Anführungszeichen enthalten, haben den Typ double.
    • Felder mit den Werten true oder false haben den Typ bool.
    • Felder, die als Werte Strings enthalten, haben den Typ string.

    Lange 64-Bit-Ganzzahlen werden in Stringfeldern gespeichert, da sie nicht exakt als Werte des Typs double dargestellt werden können.

  • Die Typen Duration und Timestamp werden nur in Protokollpufferfeldern erkannt. Andernfalls werden diese Werte in Stringfeldern gespeichert.

Vergleichsoperator

Die Bedeutung der Gleichheitsoperatoren (=, !=) und Ungleichheitsoperatoren (<, <=, >, >=) hängt vom zugrunde liegenden Typ des linken Feldnamens ab.

  • Alle numerischen Typen: Gleichheits- und Ungleichheitsoperatoren haben hinsichtlich Zahlen ihre normale Bedeutung.
  • bool: Gleichheit bedeutet, der boolesche Wert ist identisch. Ungleichheit wird durch true>false definiert.
  • enum: Gleichheit bedeutet, der Aufzählungswert ist identisch. Für Ungleichheit werden die zugrunde liegenden numerischen Werte der Aufzählungsliterale verwendet.
  • Duration: Gleichheit bedeutet, die Dauer ist identisch. Ungleichheit basiert auf der Dauer. Beispiel für die Dauer: "1s">"999ms".
  • Timestamp: Gleichheit bedeutet, der Zeitpunkt ist identisch. Wenn a und b Timestamp-Werte sind, bedeutet a < b a. liegt zeitlich vor b.
  • bytes: Die Operanden werden Byte für Byte von links nach rechts verglichen.
  • string: Bei Vergleichen wird die Groß-/Kleinschreibung ignoriert. Beide Operanden werden zuerst mit der Unicode-Normalisierung NFKC_CF normalisiert und verwenden anschließend lexikografische Vergleiche. Suchabfragen mit regulären Ausdrücken werden allerdings nicht normalisiert. Weitere Informationen zum Suchen von Logeinträgen mit regulären Ausdrücken finden Sie unter Logeinträge mit regulären Ausdrücken abfragen und filtern.

Der Teilstringoperator (:) gilt für string und bytes und wird im Prinzip wie ein Gleichheitsoperator verarbeitet. Einzige Ausnahme ist, dass der rechte Operand nur mit einem Teil des linken Feldes übereinstimmen muss. Bei Teilstring-Übereinstimmungen mit indexierten Feldern werden keine Logindexe genutzt.

Globale Einschränkungen

Wenn der Vergleich aus einem einzelnen Wert besteht, wird dies als globale Einschränkung bezeichnet. Logging verwendet den Operator has (:), um zu bestimmen, ob ein Feld in einem Logeintrag oder seine Nutzlast die globale Einschränkung enthält. Wenn dies der Fall ist, ist der Vergleich erfolgreich.

Die einfachste Abfrage in Bezug auf eine globale Einschränkung ist ein einzelner Wert:

"The Cat in The Hat"

Sie können globale Einschränkungen mit den Operatoren AND und OR für komplexere Abfragen kombinieren. Wenn Sie beispielsweise alle Logeinträge aufrufen möchten, die ein Feld mit dem Wert cat und ein Feld mit entweder hat oder bat enthalten, schreiben Sie die Abfrage so:

(cat AND (hat OR bat))

In diesem Fall gibt es drei globale Einschränkungen: cat, hat und bat. Diese globalen Einschränkungen werden getrennt angewendet und die Ergebnisse werden kombiniert, als ob der Ausdruck ohne Klammern geschrieben worden wäre.

Eine globale Einschränkung bietet eine einfache Möglichkeit, um Logs nach einem bestimmten Wert abzufragen. Beispielsweise können Sie für die Suche nach Einträgen in Ihrem Aktivitätslog, die GCE_OPERATION_DONE enthalten, die folgende Abfrage verwenden:

    logName = "projects/my-project-id/logs/compute.googleapis.com%2Factivity_log" AND
    "GCE_OPERATION_DONE"

Obwohl globale Einschränkungen einfach sind, können sie langsam sein. Weitere Informationen finden Sie auf dieser Seite unter Logeinträge schnell finden.

Funktionen

Sie können integrierte Funktionen als globale Einschränkungen in Abfragen nutzen:

function = identifier ( [ argument { , argument } ] )

Dabei steht argument für einen Wert, einen Feldnamen oder einen Ausdruck in Klammern. Die Funktionen sind in den folgenden Abschnitten beschrieben.

log_id

Die Funktion log_id gibt Logeinträge zurück, die mit dem angegebenen Argument [LOG_ID] aus dem Feld logName übereinstimmen:

  log_id([LOG_ID])

Die folgende Abfrage gibt beispielsweise alle Logeinträge, die cloudaudit.googleapis.com%2Factivity [LOG_ID] enthalten, zurück:

  log_id("cloudaudit.googleapis.com/activity")

Quelle

Die Funktion source gleicht Logeinträge aus einer bestimmten Ressource in der Hierarchie von Organisationen, Ordnern und Cloud-Projekten ab.

Die Funktion source stimmt nicht mit untergeordneten Ressourcen überein. Mit source(folders/folder_123) werden beispielsweise Logs aus der Ressource folder_123 und nicht aus Logs der Cloud-Projektressourcen in folder_123 abgeglichen.

Verwenden Sie die folgende Syntax, um Logs auf einer bestimmten Ressourcenebene abzufragen:

source(RESOURCE_TYPE/RESOURCE_ID)
Ressource Beispielabfrage
Organisation source(organizations/ORGANIZATION_ID)
Ordner source(folders/FOLDER_ID)
Cloud-Projekte source(projects/PROJECT_ID)

Beispiel

Mit der Funktion sample wird ein Anteil der Gesamtzahl von Logeinträgen ausgewählt:

sample([FIELD], [FRACTION])

[FIELD] ist der Name eines Felds im Logeintrag, beispielsweise logName oder jsonPayload.a_field. Der Wert des Felds bestimmt, ob der Logeintrag in die Stichprobe einbezogen wird. Der Feldtyp muss ein String oder ein numerischer Wert sein. Eine gute Wahl ist, [FIELD] auf insertId festzulegen, da jeder Logeintrag einen anderen Wert für dieses Feld hat.

[FRACTION] ist der Anteil der Logeinträge, die einzubeziehende Werte für [FIELD] enthalten. Es ist eine Zahl größer als 0,0 und kleiner oder gleich 1,0. Wenn Sie beispielsweise 0.01 angeben, enthält die Stichprobe etwa 1 % aller Logeinträge mit Werten für [FIELD]. Wenn [FRACTION] den Wert 1 hat, werden alle Logeinträge ausgewählt, die Werte für [FIELD] enthalten.

Beispiel: Durch die folgende Abfrage werden 25 % der Logeinträge des Logs syslog zurückgegeben:

    logName = "projects/my-project/logs/syslog" AND sample(insertId, 0.25)

Details: Es wird ein auf der Hash-Technologie basierender deterministischer Algorithmus verwendet, um zu bestimmen, ob ein Logeintrag in der Stichprobe enthalten oder davon ausgeschlossen ist. Die Genauigkeit der resultierenden Stichprobe hängt von der Verteilung der Hash-Werte ab. Wenn die Hash-Werte nicht gleichmäßig verteilt sind, kann die resultierende Stichprobe verzerrt sein. Im schlimmsten Fall, wenn nämlich [FIELD] immer den gleichen Wert enthält, umfasst die resultierende Stichprobe entweder die [FRACTION] aller Logeinträge oder gar keine Logeinträge.

Wenn [FIELD] in einem Logeintrag enthalten ist, dann gilt:

  • Ein Hash des Werts wird berechnet.
  • Der Hash-Wert, bei dem es sich um eine Zahl handelt, wird durch den maximal möglichen Hash-Wert geteilt.
  • Wenn der resultierende Bruch kleiner oder gleich [FRACTION] ist, wird der Logeintrag in die Stichprobe eingeschlossen. Andernfalls wird er aus der Stichprobe ausgeschlossen.

Wenn [FIELD] nicht in einem Logeintrag enthalten ist, dann gilt:

  • Wenn [FIELD] zur Nutzlast des Logeintrags oder zu den Abschnitten unter labels gehört, wird der Logeintrag nicht für die Stichprobe ausgewählt, selbst wenn [FRACTION] den Wert 1 hat.
  • Andernfalls wird der Logeintrag behandelt, als wäre [FIELD] im Logeintrag enthalten. Der Wert von [FIELD] ist dann der Standardwert, der vom Typ LogEntry bestimmt wird. Weitere Informationen zu fehlenden Feldern und Standardfeldern finden Sie auf dieser Seite unter Fehlende Felder.

Wenn Sie Logeinträge mit standardmäßigen Feldern aus der Stichprobe ausschließen möchten, verwenden Sie für vorhandene Felder den Operator :*. Die folgende Abfrage gibt 1 % der Logeinträge, in denen explizit ein Wert für field angegeben ist, als Stichprobe zurück:

field:* AND sample(field, 0.01)

Funktion "ip_in_net"

Die Funktion ip_in_net gibt an, ob eine IP-Adresse in einem Logeintrag in einem Subnetz enthalten ist. Sie könnten mit dieser Funktion erkennen, ob eine Anfrage von einer internen oder externen Quelle stammt. Beispiel:

ip_in_net([FIELD], [SUBNET])

[FIELD] ist ein Feld mit einem Stringwert im Logeintrag, das eine IP-Adresse oder einen IP-Bereich enthält. Das Feld kann sich wiederholen. In diesem Fall muss nur eines der wiederholten Felder eine im Subnetz enthaltene IP-Adresse oder einen IP-Bereich enthalten.

[SUBNET] ist eine Stringkonstante für eine IP-Adresse oder einen IP-Bereich. Wenn [SUBNET] keine gültige IP-Adresse oder kein gültiger IP-Bereich ist, tritt ein Fehler auf. Darauf wird später in diesem Abschnitt eingegangen.

Beispiel: Mit der folgenden Abfrage wird eine IP-Adresse in der Nutzlast von Logeinträgen aus dem Log my_log getestet:

    logName = "projects/my_project/logs/my_log" AND
    ip_in_net(jsonPayload.realClientIP, "10.1.2.0/24")

Details: Wenn [FIELD] in einem Logeintrag fehlt, standardmäßig eingespielt wird oder keine zulässige IP-Adresse oder keinen zulässigen IP-Bereich enthält, wird "false" zurückgegeben. Weitere Informationen zu fehlenden Feldern und Standardfeldern finden Sie auf dieser Seite unter Fehlende Felder.

Beispiele für unterstützte IP-Adressen und -Bereiche:

  • IPv4: 10.1.2.3
  • IPv4-Subnetz: 10.1.2.0/24
  • CIDR IPv6: 1234:5678:90ab:cdef:1234:5678:90ab:cdef
  • CIDR IPv6-Subnetz: 1:2::/48

Nach Zeitraum suchen

In der Benutzeroberfläche können Sie Datums- und Uhrzeitbereiche für die Logeinträge festlegen, die angezeigt werden sollen. Beispiel: Wenn Sie in der Abfrage folgende Bedingungen einfügen, werden in der Legacy-Loganzeige nur die Logeinträge des angegebenen 30-Minuten-Zeitraums aufgelistet. Scrollen außerhalb dieses Zeitraums ist nicht möglich:

timestamp >= "2016-11-29T23:00:00Z"
timestamp <= "2016-11-29T23:30:00Z"

Geben Sie das Datum und die Uhrzeit beim Schreiben von Abfragen mit Zeitstempel wie oben gezeigt an.

Sie können Logeinträge auch mit timestamp-Kürzeln suchen. Beispielsweise haben Sie die Möglichkeit, ein Datum mit einem Vergleichsoperator einzugeben, um alle Logeinträge nach einem bestimmten Tag abzurufen:

  timestamp > "2016-11-29"

Reguläre Ausdrücke verwenden

Sie haben die Möglichkeit, mithilfe von regulären Ausdrücken Abfragen und Filter für Senken, Messwerte sowie überall dort zu erstellen, wo Logfilter verwendet werden. Sie können reguläre Ausdrücke in Query Builder und mit dem gcloud command-line tool nutzen.

Ein regulärer Ausdruck ist eine Folge von Zeichen, die eine Suche definieren. Die Abfragesprache verwendet die RE2-Syntax. Eine vollständige Erläuterung der RE2-Syntax finden Sie im RE2-Wiki auf GitHub.

Abfragen mit regulären Ausdrücken haben folgende Merkmale:

  • Es können nur Felder vom Typ "String" mit einem regulären Ausdruck abgeglichen werden.

  • Es wird keine Stringnormalisierung ausgeführt. Beispielsweise ist kubernetes nicht dasselbe wie KUBERNETES. Weitere Informationen finden Sie im Abschnitt Vergleichsoperatoren.

  • Bei Abfragen wird die Groß- und Kleinschreibung berücksichtigt und sie sind nicht standardmäßig verankert.

  • Boolesche Operatoren können zwischen mehreren regulären Ausdrücken auf der rechten Seite des Vergleichsoperators für reguläre Ausdrücke (=~ und !~) verwendet werden.

Eine Abfrage mit einem regulären Ausdruck hat die folgende Struktur:

Entspricht einem Muster:

jsonPayload.message =~ "regular expression pattern"

Entspricht keinem Muster:

jsonPayload.message !~ "regular expression pattern"

=~ und !~ ändern die Abfrage in eine Abfrage mit einem regulären Ausdruck. Das Muster, das Sie abgleichen möchten, muss in doppelte Anführungszeichen gesetzt werden. Bei der Abfrage von Mustern, in denen doppelte Anführungszeichen enthalten sind, müssen Sie sie mit einem umgekehrten Schrägstrich maskieren.

Beispiele für die Abfrage von Logs mit regulären Ausdrücken

Abfragetyp Beispiel
Standardabfrage sourceLocation.file =~ "foo"
Abfrage mit Suche ohne Berücksichtigung der Groß- und Kleinschreibung labels.subnetwork_name =~ "(?i)foo"
Abfrage mit Anführungszeichen jsonPayload.message =~ "field1=\"bar.*\""
Abfrage mit einem booleschen or labels.pod_name =~ "(foo|bar)"
Abfrage mit Anchors logName =~ "/my%2Flog$"
Abfrage entspricht keinem Muster labels.pod_name !~ "foo"
Abfrage mit einem booleschen Operator labels.env =~ ("^prod.*server" OR "^staging.*server")

Logeinträge schnell finden

Gehen Sie so vor, um Logeinträge schneller zu finden:

  • Erstellen Sie eine Abfrage mit indexierten Feldern.
  • Minimieren Sie die Anzahl der Logeinträge, die geprüft werden sollen.

Indexierte Felder verwenden

Die folgenden LogEntry-Felder sind indexiert:

In den folgenden Abschnitten wird erläutert, wie mit diesen indexierten Feldern die Anzahl der zu durchsuchenden Logeinträge minimiert wird.

Abfragen optimieren

Sie können Suchanfragen beschleunigen, indem Sie die Anzahl der Logs oder Logeinträge oder den Zeitraum jeder Suche reduzieren. Optimalerweise reduzieren Sie alle drei.

Beispiel: Den richtigen Lognamen verwenden

Geben Sie das Log mit den relevanten Logeinträgen an. Wichtig ist, dass Sie den tatsächlichen Lognamen kennen. Diesen finden Sie in Ihren Logeinträgen. Beispielsweise zeigt die Legacy-Loganzeige an, dass im Compute Engine-Abschnitt ein Log namens „Aktivität“ enthalten ist. Bei genauerer Prüfung der Logeinträge für Administratoraktivitäten sehen Sie, dass das Log tatsächlich „cloudaudit.googleapis.com/activity“ heißt.

Der folgende Vergleich ist falsch. Es wird keine Übereinstimmung zurückgegeben, da der Logname falsch ist:

    logName = "projects/my-project-id/logs/activity"   # WRONG!

Der folgende Vergleich ist richtig. Damit werden Logeinträge aus dem Audit-Log für Administratoraktivitäten ausgewählt. Wichtig ist, dass der Logname wie folgt URL-codiert ist:

    logName = "projects/my-project-id/logs/cloudaudit.googleapis.com%2Factivity"

Beispiel: Die richtigen Logeinträge auswählen

Wenn Sie wissen, dass die gewünschten Logeinträge aus einer bestimmten VM-Instanz stammen, geben Sie die Instanz an. Prüfen Sie die Richtigkeit der Labelnamen in einem der zu durchsuchenden Logeinträge. Im folgenden Beispiel ist instance_id eines der indexierten Labels:

    resource.type = "gce_instance" AND
    resource.labels.instance_id = "6731710280662790612"
    logName = "projects/my-project-id/logs/cloudaudit.googleapis.com%2Factivity"

Beispiel: Den richtigen Zeitraum auswählen

Gib einen Zeitraum für die Suche an. Nützliche Zeitstempel im RFC 3339-Format lassen sich schnell mit dem GNU/Linux-Befehl date festlegen:

$ date --rfc-3339=s
2016-06-27 17:39:00-04:00
$ date --rfc-3339=s --date="3 hours ago"
2016-06-27 14:40:00-04:00
$ date --rfc-3339=s --date="5 hours ago"
2016-06-27 12:40:00-04:00

Verwenden Sie die Werte dieser Zeitstempel in den folgenden Abfragen. Wenn Sie einen für Logging akzeptablen Zeitstempel erstellen möchten, ersetzen Sie das Leerzeichen zwischen Datum und Uhrzeit durch den Buchstaben T.

Durchsuchen Sie z. B. die Einträge der vergangenen drei Stunden:

    timestamp >= "2016-06-27T14:40:00-04:00"

Oder durchsuchen Sie den Zeitraum vor drei bis fünf Stunden:

    timestamp >= "2016-06-27T12:40:00-04:00" AND
    timestamp <= "2016-06-27T14:40:00-04:00"

Globale und Teilstring-Suchanfragen minimieren

Kürzen Sie Abfragen bei der Eingabe nicht ab.

Beispiel: Keine globalen Suchanfragen verwenden

Wenn Sie nach einem Logeintrag mit "Hello Kitty" in der Nutzlast suchen:

  • Falsch: Verwenden Sie keine globale Suchanfrage. Sie sind aus einem Grund alle Teilstring-Suchanfragen:

        "Hello Kitty"   # THIS CAUSES A SLOW SEARCH!
    
  • Richtig: Begrenzen Sie die Suche auch dann auf ein einzelnes Feld, wenn Sie eine Teilstring-Suche durchführen müssen:

        textPayload:"Hello Kitty"
    
  • Richtig: Führen Sie nach Möglichkeit einen Gleichheitstest durch:

        textPayload = "Hello Kitty"
    
  • Richtig: Referenzieren Sie einzelne Felder in einer Nutzlast, wenn die Logeinträge über strukturierte Nutzlasten verfügen:

        jsonPayload.my_favorite_cat = "Hello Kitty"
    
  • Richtig: Schränken Sie die Suche durch Verwendung eines indexierten Felds ein:

        logName = "projects/my-project_id/logs/somelog" AND
        jsonPayload.my_favorite_cat = "Hello Kitty"
    

Beispiele durchsuchen

Die angezeigten Logeinträge stimmen mit einer Abfrage überein. Wenn das Menü Zu Zeitpunkt springen einen Wert enthält, wird in der Anzeige zu diesem Zeitpunkt gescrollt. Hier einige Beispiele für Abfragen:

resource.type=gae_app

Hiermit werden alle App Engine-Logeinträge zurückgegeben. Eine Liste der Ressourcentypen finden Sie unter Liste überwachter Ressourcen.

Während der Eingabe werden in der Legacy-Loganzeige Vorschläge für Felder wie resource.type eingeblendet.

resource.type=gae_app AND logName:request_log

Hiermit werden Logeinträge für App Engine-Apps aus Logs zurückgegeben, deren Name request_log enthält. Beachten Sie Folgendes:

  • Der Operator = steht für genaue Gleichheit. Der Ressourcentyp muss genau mit "gae_app" übereinstimmen. Die Groß-/Kleinschreibung wird nicht beachtet.
  • Der Operator : steht für "has" (enthält). Das Feld logName muss request_log enthalten. Die Groß-/Kleinschreibung wird nicht beachtet. Der tatsächliche Logname ist deutlich länger. Der Operator : kann Suchanfragen verlangsamen.
  • Die beiden Vergleiche werden durch AND verbunden. Sie können auch OR verwenden. Wenn Sie den Operator weglassen, gilt standardmäßig AND.
resource.type = (gce_instance OR aws_ec2_instance) AND severity >= ERROR

Hiermit werden Logeinträge mit einem der beiden Ressourcentypen "Compute Engine-VM-Instanz" oder "AWS EC2-VM-Instanz" zurückgegeben. Für die Logeinträge muss mindestens die severity ERROR gelten. Das entspricht in der Abfrageoberfläche der Auswahl von ERROR im Menü für Wichtigkeitsstufen.

logName = "projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"

Hiermit werden alle Audit-Log-Einträge zu Administratoraktivitäten im Projekt [PROJECT_ID] zurückgegeben. Alle Audit-Logs eines Projekts verwenden denselben Namen, haben aber unterschiedliche Ressourcentypen. Die Log-ID cloudaudit.googleapis.com/activity muss URL-codiert und im Lognamen enthalten sein. Durch Verwendung eines Gleichheitsoperators im Vergleich beschleunigen Sie die Suche. Weitere Informationen finden Sie unter Audit-Logs verstehen.

unicorn

Hiermit werden Logeinträge zurückgegeben, die in einem der Felder unicorn enthalten. Die Groß-/Kleinschreibung wird nicht beachtet. Ein Suchbegriff, der nicht Teil eines Feldvergleichs ist, bildet eine Abfrage an "alle Felder".

unicorn phoenix

Hiermit werden Logeinträge zurückgegeben, die in einem der Felder unicorn und phoenix enthalten.

textPayload:(unicorn phoenix)

Hiermit werden Logeinträge zurückgegeben, deren Feld textPayload sowohl unicorn als auch phoenix in beliebiger Reihenfolge enthält. Zwischen den beiden Wörtern wird standardmäßig der Operator AND angenommen.

textPayload:"unicorn phoenix"

Hiermit werden Logeinträge zurückgegeben, deren Feld textPayload den String "unicorn phoenix" enthält.

NOT textPayload: "unicorn phoenix"

Hiermit werden Logeinträge zurückgegeben, deren Feld textPayload den String "unicorn phoenix" nicht enthält. Diese Art der Abfrage reduziert unerwünschte Logeinträge.

timestamp >= "2016-11-29T23:00:00Z" timestamp <= "2016-11-29T23:30:00Z"

Hiermit werden Logeinträge innerhalb eines 30-Minuten-Zeitraums zurückgegeben.

Fehlerbehebung

Syntaxprobleme

Prüfen Sie bei Problemen mit Ausdrücken von Abfragen Folgendes:

  • Die Abfragen erfüllen die Syntaxregeln hinsichtlich entsprechender Klammern und Anführungszeichen. Ihre Abfrage darf keine Kommentare enthalten.

  • Die Feldnamen für die Log-Einträge sind korrekt geschrieben.

  • Boolesche Operatoren sind in Großbuchstaben angegeben (AND, OR, NOT).

  • Achten Sie darauf, dass Sie NULL_VALUE für die Darstellung von JSON-Nullwerten verwenden.

  • Boolesche Ausdrücke, die als globale Einschränkungen oder als rechte Seite in Vergleichen verwendet werden, sollten der Übersichtlichkeit halber in Klammern gesetzt werden. Die beiden Abfragen unten sehen beispielsweise gleich aus, sind aber unterschiedlich:

    insertId = "ABC-1" OR "ABC-2"  # ERROR!?
    insertId = ("ABC-1" OR "ABC-2")
    
  • Text ohne Anführungszeichen darf keine Sonderzeichen enthalten. Fügen Sie im Zweifelsfall doppelte Anführungszeichen hinzu. Der erste Vergleich unten ist beispielsweise aufgrund des eingebetteten Teilstring-Operators (:) unzulässig. Er muss Anführungszeichen enthalten:

    insertId = abc:def  # ILLEGAL!
    insertId = "abc:def"
    
  • Beim gcloud-Befehlszeilentool muss die Abfrage in doppelte Anführungszeichen gesetzt werden. Wenn Sie mit dem Befehl gcloud logging doppelte Anführungszeichen als Maskierungszeichen von Sonderzeichen verwenden möchten, setzen Sie den gesamten Filter stattdessen in einfache Anführungszeichen:

    gcloud logging read 'resource.type=gce_instance AND jsonPayload.message="Stopped Unattended Upgrades Shutdown."'
    gcloud logging read 'timestamp>="2020-06-17T21:00:00Z"'