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 EventNameFelder 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:
searchsearch "compartmentOCID/loggroup1/logname1" "compartmentOCID/loggroup2/logname2" "compartmentOCID/loggroup3/logname3"whereFiltert 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.isParSie 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 datetimetop 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}sortSortiert 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..."}dedupVerarbeitet 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}selectWendet 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"}extendErweitert 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:
andor
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
countBerechnet eine Anzahl von Zeilen im aktuellen Logstream:
search "application"
| count
>>
{"count": 6}summarizeGruppiert 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 timestampSpezielle Spalten
logContentlogContent 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. |