Spezifikation der Loggingabfragesprache

Verwenden Sie Abfragesyntaxkomponenten mit benutzerdefinierten Suchen im erweiterten Modus auf der Logging-Seite Suchen.

Weitere Informationen finden Sie unter Erweiterte Suchabfragen und Gespeicherte Suchen.

Abfragekomponenten

Die Verarbeitung der Loggingabfragesprache basiert auf einem Datenflussmodell. Jede Abfrage kann ein oder mehrere Logs referenzieren und erzeugt als Ergebnis einen Tabellendatensatz. Die Abfragesprache bietet mehrere Operatoren zum Suchen, Filtern und Aggregieren von strukturierten und unstrukturierten Logs.

Eine Loggingabfrage umfasst die folgenden Komponenten:

Logstreams

Um mit der Suche zu beginnen, müssen Sie zunächst die Logs definieren, die Sie durchsuchen möchten. Sie können bestimmte Logobjekte, Loggruppen oder Compartments durchsuchen. Sie können beliebig viele Logs miteinander kombinieren. Der Suchbereich wird nach dem folgenden Muster definiert:
search <log_stream> (,? <log_stream>)*

Die Abfragesprache ruft Logeinträge aus dem angegebenen Geltungsbereich ab und erstellt einen Logstream, den Sie filtern, aggregieren und visualisieren können.

Logstream:

<log_stream> := "<compartment_ocid> ( /<log_goup_ocid> ( /<log_object_ocid> )? )?"

Beispiele:

search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid"
search "compartmentOcid/logGroupNameOrOcid"
search "compartmentOcid"
search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid", "compartmentOcid_2/logGroupNameOrOcid_2", "compartmentOcid_3"

Felder

Bei allen Feldern in Logstreams wird die Groß- und Kleinschreibung berücksichtigt. Obwohl tatsächliche Logs nur in Kleinbuchstaben indexierte Felder aufweisen, können Sie in der Abfrage auch neue Felder mit gemischter Groß-/Kleinschreibung erstellen:
search "..."
   | select event as EventName

Felder werden in JSON-Notation dargestellt. Sonderzeichen müssen daher in Anführungszeichen stehen.

Fields: <field_name> := <identifier> (DOT <identifier>)*

Für ID:

<identifier> := a-zA-Z_[a-zA-Z_0-9]* | ('"' (~'"' | '""')* '"')

Beispiele:

  • type
  • data.message
  • data.request.URL
  • "type"
  • "data"."message"
  • "data.message" (nicht identisch mit "data"."message")
  • data."$event"
  • data."Vorname"
  • data."ein Beispiel für maskierte ("") doppelte Anführungszeichen"

Datentypen

Die folgenden Schlüsseldatentypen werden von der Abfragesprache unterstützt. Sie betragen 8 Byte (lang und doppelt).

Einzelheiten zur Darstellung der Werte der entsprechenden Typen finden Sie unter Literale.

  • Zeichenfolgen
  • Zahlen (Ganzzahl, Fließkomma)
  • Arrays
  • Boolesche Werte
  • Zeitstempel
  • Intervalle

Streamausdrücke

Alle Ausdrücke, die einen Stream erzeugen, sind Streamausdrücke. Streamausdrücke können mit den folgenden Operatoren gebildet werden:

Pipeausdrücke

Eine Pipe (|) wendet einen linksseitigen Operator auf einen rechtsseitigen Streamausdruck an. Der Pipeausdruck ist ein Streamausdruck.

Der Operator auf der rechten Seite einer Pipe darf nur einen Stream in Anspruch nehmen (z.B. Aggregatvorgänge, Filter).

Die linke Seite wird zum "aktuellen Stream" für den Ausdruck auf der rechten Seite, sodass alle Felder im aktuellen Stream anhand von Kurznamen verfügbar sind. Beispiel:
search "application"
  | where level = 'ERROR'
 
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}

Operatoren

Beim Durchführen erweiterter Abfragen wird Folgendes unterstützt:

Tabellarische Operatoren

Ein tabellarischer Operator erstellt oder ändert einen Logstream, indem er Logeinträge herausfiltert oder ändert. Siehe auch BNF-Syntaxnotation. Im Folgenden finden Sie tabellarische Operatoren:

where

Filtert den aktuellen Logstream mithilfe eines booleschen Ausdrucks.

search "application"
  | where level = 'ERROR'
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}

where ist optional:

search "application"
   | level = 'ERROR'

Im Folgenden finden Sie Beispiele für Vergleiche mit Zahlen und Vergleiche mit booleschen Feldern:

| data.statusCode = 200
| data.isPar

Sie können eine Volltextsuche durchführen, indem Sie einen Filter für den gesamten Inhalt des Logs angeben. Eine Suche in logContent gibt jede Logzeile zurück, in der ein Wert mit Ihrer Zeichenfolge übereinstimmt. Diese Funktionalität unterstützt Platzhalter. Beispiel:

search "application"
   | where logContent = 'ERROR' -- returns log lines with a value matching "ERROR"
search "application"
   | where logContent = '*ERROR*' -- returns log lines with a value containing "ERROR"
top
Ruft nur eine angegebene Anzahl von Zeilen aus dem aktuellen Logstream ab, sortiert nach einem bestimmten Ausdruck.
<top> := top [0-9]+ by <expr>

Beispiele:

  • top 3 by datetime
  • top 3 by *
  • top 3 by (a + b)

Die Anzahl von Zeilen muss eine konstante positive Ganzzahl sein, und ein Sortierausdruck muss angegeben werden.

search "application"
  | top 3 by impact
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
sort

Sortiert den aktuellen Logstream nach den angegebenen Spalten in aufsteigender (Standard) oder absteigender Reihenfolge. Der Operator verwendet die Schlüsselwörter "DESC" und "ASC", um die Reihenfolge anzugeben. Die Standardsortierreihenfolge ist asc.

<sort> := sort by <sort_expr> (, <sort_expr>)*
<sort_expr> := <expr> (asc | desc)?

Beispiel:

search "application"
  | sort by impact desc
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started..."}

Zur Angabe der Reihenfolge können mehrere Spalten verwendet werden:

search "application"
  | sort by host, impact desc
>>
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started..."}
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated..."}
dedup

Verarbeitet den aktuellen Logstream, indem alle Duplikate nach angegebenen Spalten herausgefiltert werden. Wenn mehrere Spalten angegeben sind, müssen alle Spalten durch Kommas getrennt werden.

<dedup> := dedup <expr> (, <expr>)

Beispiele:

search "application"
  | dedup host
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
search "application"
  | dedup host, impact
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5}
select

Wendet eine Reihe von benannten skalaren Ausdrücken auf den aktuellen Logstream an. Eine Aggregationsversion von select finden Sie unter summarize.

<select> := select <select_expr> (, <select_expr>)*
<select_expr> := ( * | <expr> (as <identifier>)? )

Beispiel:

search "application"
  | select level, host, impact+10 as impact, timestamp
>>
{"level":"ERROR", "host":"host1", "impact": 12, "timestamp": "2019-01-03T00:04:01"}
{"level":"INFO", "host":" host1", "timestamp": "2019-01-03T00:04:05"}
{"level":"WARNING", "host":"host2", "impact": 11, "timestamp": "2019-01-03T00:05:33"}
{"level":"ERROR", "host":"host2", "impact": 14, "timestamp": "2019-01-03T00:06:39"}
{"level":"ERROR", "host":"host2", "impact": 15, "timestamp": "2019-01-03T00:06:59"}
{"level":"INFO", "host":" host2", "timestamp": "2019-01-03T00:06:59"}
extend

Erweitert den aktuellen Logstream um eine berechnete Spalte.

<extend> := extend <expr> (as <identifier>)?

Beispiel:

search "application"
  | extend concat(host, 'us.oracle.com') as fqn
>>
{"timestamp": "2019-01-03T00:04:01", "level":"ERROR", "host":"host1", "message":"download failed...", "impact":2, "fqn": "host1.us.oracle.com"}
{"timestamp": "2019-01-03T00:04:05", "level":"INFO", "host":" host1", "message":"host list updated...", "fqn": "host1.us.oracle.com"}
{"timestamp": "2019-01-03T00:05:33", "level":"WARNING", "host":"host2", "message":"reached 70% file size limit... ", "impact":1, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:39", "level":"ERROR", "host":"host2", "message":"reached 90% file size limit... ", "impact":4, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:59", "level":"ERROR", "host":"host2", "message":"reached 95% file size limit... ", "impact":5, "fqn": "host2.us.oracle.com"}
{"timestamp": "2019-01-03T00:06:59", "level":"INFO", "host":" host2", "message":"fs clean up started...", "fqn": "host2.us.oracle.com"}

Skalare Operatoren

Skalare Operatoren gelten für einzelne Werte.

Im Folgenden finden Sie arithmetische Vorgänge:

  • +
  • -
  • *
  • /

Im Folgenden finden Sie boolesche Operatoren:

  • and
  • or

Unärer Operator:

  • -(<expr>)

Im Folgenden finden Sie Vergleichsoperatoren (nur numerische Ausdrücke):

  • <expr> > <expr>
  • <expr> >= <expr>
  • <expr> <= <expr>
  • <expr> < <expr>
  • <expr> = <expr>
  • <expr> != <expr>

Zeichenfolgenvergleich:

  • <expr> = <expr>

Funktionen:

  • not (<expr>)
  • contains_ci/contains_cs (<expr>, <expr>, (true | false))

    Beim letzten Parameter wird die Groß- und Kleinschreibung berücksichtigt.

  • rounddown (<expr>, '[0-9]+(d | h | m | s)')

    Der letzte Parameter ist das Zeitintervall in Tagen, Stunden, Minuten oder Sekunden.

    time_format(datetime, <format>)

    Zeit in Zeichenfolge formatieren

  • concat (<axpr>, <expr>)
  • upper (<expr>)
  • lower (<expr>)
  • substr (<expr>, [0-9]+ (, [0-9]+)?)

    Das zweite Argument ist der Startindex. Das dritte Argument ist optional. Es gibt an, wie viele Zeichen zu verwenden sind.

  • isnull (<expr>)
  • isnotnull (<expr>)

Aggregatoperatoren

count

Berechnet eine Anzahl von Zeilen im aktuellen Logstream:

search "application"
  | count
>>
{"count": 6}
summarize

Gruppiert den aktuellen Logstream nach den angegebenen Spalten und dem angegebenen Zeitintervall und aggregiert ihn mit benannten Ausdrücken. Wenn keine Gruppierungsspalten angegeben sind, aggregiert summarize den gesamten Stream.

search "application"
  | summarize count(impact) as impact by level, rounddown(datetime,  '1m') as timestamp

Spezielle Spalten

logContent

logContent ist eine spezielle Spalte, die den Text der gesamten ursprünglichen Nachricht wiedergibt. Beispiel:

search "application"
   | where logContent = '*ERROR*' -- returns log lines with a value containing "ERROR"

Kommentare

Sowohl Kommentare mit einer Zeile als auch Kommentare mit mehreren Zeilen werden unterstützt. Beispiel:

search "application"
  | count -- this is a single line comment
/* this is a
   multi-line
   comment
*/

IDs

IDs sind die Namen aller verfügbaren Entitys in der Abfrage. Eine ID kann ein Feld im aktuellen Logstream oder einen Parameter referenzieren, der am Anfang der Abfrage definiert ist. IDs weisen das folgende Format auf:

name: \$?[a-zA-Z_][a-zA-Z_0-9]*

Beispiel: level, app_severity, $level.

Das Format mit Anführungszeichen erlaubt spezielle Symbole in den Namen (mit Ausnahme von doppelten Anführungszeichen):

name: "[^"]+"

Beispiel: "opc-request-id", "-level".

Alle Parameterreferenzen beginnen mit einem Dollarzeichen ($), z.B. $level.

Literale

Typ Beispiele
Zeichenfolge 'hello', 'world\'!'
Platzhaltermuster "acc-*"
Ganzzahl -1, 0, +200
Fließkomma 1.2, 0.0001, 1.2e10
Array [1,2,3,4], []
Intervall 3h, 2m
Auf Null setzbar null

Funktionen

Im Folgenden finden Sie skalare Funktionen:

  • isnull(expr1)
  • concat(expr1, ...)

Im Folgenden finden Sie Aggregatfunktionen:

  • sum(expr1)
  • avg(expr1)
  • min(expr1)
  • max(expr1)
  • count(): Ermittelt eine Anzahl von Zeilen.
  • count(expr): Ermittelt eine Anzahl von Nicht-Null-expr-Werten.
  • first(expr1)
  • last(expr1)

Systemparameter

Alle Parameter mit dem prefex "query." sind reserviert. Die folgenden Parameter werden unterstützt:

Name Typ Beispiel Beschreibung
query.from Zeichenfolge mit Datum/Uhrzeit im Format ISO 8601. '2007-04-05T14:30' Gibt die Startzeit des Abfragefensters an.
query.to Zeichenfolge mit Datum/Uhrzeit im Format ISO 8601. '2007-04-05T14:30+05:00' Gibt die Endzeit des Abfragefensters an.