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
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
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).
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
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:
search
search "compartmentOCID/loggroup1/logname1" "compartmentOCID/loggroup2/logname2" "compartmentOCID/loggroup3/logname3"
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
<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. |