Specifica lingua query di log
Utilizzare i componenti della sintassi delle query con ricerche personalizzate in modalità avanzata nella pagina Cerca di log.
Per ulteriori informazioni, vedere anche Query di ricerca avanzata e Ricerche salvate.
Esegui query sui componenti
L'elaborazione del linguaggio di query di log si basa su un modello di flusso dati. Ogni query può fare riferimento a uno o più log e di conseguenza generare un set di dati di tabella. Il linguaggio di query fornisce diversi operatori per la ricerca, il filtro e l'aggregazione di log strutturati e non strutturati.
Una query di log include i componenti riportati di seguito.
Flussi di log
search <log_stream> (,? <log_stream>)*
Il linguaggio di query recupera le voci di log dall'ambito fornito e crea un flusso di log che è possibile filtrare, aggregare e visualizzare.
Flusso di log:
<log_stream> := "<compartment_ocid> ( /<log_goup_ocid> ( /<log_object_ocid> )? )?"
Esempi:
search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid"
search "compartmentOcid/logGroupNameOrOcid"
search "compartmentOcid"
search "compartmentOcid/logGroupNameOrOcid/logNameOrOcid", "compartmentOcid_2/logGroupNameOrOcid_2", "compartmentOcid_3"
Campi
search "..."
| select event as EventName
I campi sono in notazione JSON, pertanto i caratteri speciali devono essere racchiusi tra virgolette.
Fields: <field_name> := <identifier> (DOT <identifier>)*
Per Identificativo:
<identifier> := a-zA-Z_[a-zA-Z_0-9]* | ('"' (~'"' | '""')* '"')
Esempi:
- Tipo
- data.message
- data.request.URL
- "tipo"
- "dati"."messaggio"
- "data.message" (non uguale a "data"."messaggio")
- dati."$evento"
- data."nome"
- data."un esempio di virgolette doppie di escape ("")"
Tipi di dati
I seguenti tipi di dati chiave sono supportati dal linguaggio di query. Questi sono (lunghi e doppi) 8 byte.
Per informazioni dettagliate sulla rappresentazione dei valori dei tipi corrispondenti, vedere Valori letterali.
- Strings
- Numeri (intero, a virgola mobile)
- Array
- Booleani
- Indicatori orari
- Intervalli
Espressioni flusso
Tutte le espressioni che producono un flusso sono espressioni di flusso. Le espressioni di flusso possono essere formate utilizzando i seguenti operatori:
Espressioni pipe
Una barra verticale (|) applica un operatore sul lato sinistro a un'espressione di flusso sul lato destro. L'espressione pipe è un'espressione di flusso.
L'operatore sul lato destro di una pipe deve utilizzare un solo flusso (ad esempio, operazioni di aggregazione, filtri).
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}
Operatori
Operatori tabulari
Un operatore tabulare crea o modifica un flusso di log filtrando o modificando le voci di log. Fare riferimento anche alla notazione della sintassi BNF. Di seguito sono riportati gli operatori in formato tabulare.
search
search "compartmentOCID/loggroup1/logname1" "compartmentOCID/loggroup2/logname2" "compartmentOCID/loggroup3/logname3"
where
Filtra il flusso di log corrente utilizzando un'espressione booleana.
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
è facoltativo:
search "application"
| level = 'ERROR'
Di seguito sono riportati alcuni esempi di confronti con numeri e campi booleani.
| data.statusCode = 200
| data.isPar
È possibile eseguire una ricerca di testo completo specificando un filtro sull'intero contenuto del log. Una ricerca in logContent
restituisce qualsiasi riga di log in cui un valore corrisponde alla stringa. Questa funzionalità supporta i caratteri jolly. Ad esempio:
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>
Esempi:
top 3 by datetime
top 3 by *
top 3 by (a + b)
Un numero di righe deve essere un numero intero positivo costante e deve essere specificata un'espressione di ordinamento.
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
Ordina il flusso di log corrente in base alle colonne specificate, in ordine crescente (predefinito) o decrescente. L'operatore utilizza le parole chiave "DESC" e "ASC" per specificare il tipo di ordine. Il criterio di ordinamento predefinito è asc
.
<sort> := sort by <sort_expr> (, <sort_expr>)*
<sort_expr> := <expr> (asc | desc)?
Ad esempio:
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..."}
È possibile utilizzare più di una colonna per specificare l'ordine:
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
Elabora il flusso di log corrente filtrando tutti i duplicati in base alle colonne specificate. Se vengono specificate più colonne, tutte devono essere delimitate da virgole.
<dedup> := dedup <expr> (, <expr>)
Esempi:
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
Applica una serie di espressioni scalari denominate al flusso di log corrente. Vedere summarize
per una versione di aggregazione di select
.
<select> := select <select_expr> (, <select_expr>)*
<select_expr> := ( * | <expr> (as <identifier>)? )
Ad esempio:
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
Estende il flusso di log corrente con una colonna calcolata.
<extend> := extend <expr> (as <identifier>)?
Ad esempio:
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"}
Operatori scalari
Gli operatori scalari sono applicabili ai singoli valori.
Le operazioni aritmetiche sono le seguenti:
+
-
*
/
Gli operatori booleani sono i seguenti:
and
or
Operatore unario:
-(<expr>)
Gli operatori di confronto sono i seguenti (solo espressioni numeriche):
<expr> > <expr>
<expr> >= <expr>
<expr> <= <expr>
<expr> < <expr>
<expr> = <expr>
<expr> != <expr>
Confronto stringhe:
<expr> = <expr>
Funzioni:
not (<expr>)
contains_ci/contains_cs (<expr>, <expr>, (true | false))
L'ultimo parametro fa distinzione tra maiuscole e minuscole.
rounddown (<expr>, '[0-9]+(d | h | m | s)')
L'ultimo parametro è l'intervallo di tempo in giorni, ore, minuti o secondi.
time_format(datetime, <format>)
Formatta ora in una stringa
concat (<axpr>, <expr>)
upper (<expr>)
lower (<expr>)
substr (<expr>, [0-9]+ (, [0-9]+)?)
Il secondo argomento è l'indice iniziale, mentre il terzo argomento è facoltativo, ovvero il numero di caratteri da utilizzare.
isnull (<expr>)
isnotnull (<expr>)
Operatori aggregati
count
Calcola un numero di righe nel flusso di log corrente:
search "application"
| count
>>
{"count": 6}
summarize
Raggruppa il flusso di log corrente in base alle colonne e all'intervallo di tempo specificati e si aggrega utilizzando espressioni denominate. Se le colonne di raggruppamento non vengono specificate, summarize
si aggrega sull'intero flusso.
search "application"
| summarize count(impact) as impact by level, rounddown(datetime, '1m') as timestamp
Colonne speciali
logContent
logContent
è una colonna speciale che rappresenta il testo dell'intero messaggio originale. Ad esempio:
search "application"
| where logContent = '*ERROR*' -- returns log lines with a value containing "ERROR"
commenti
Sono supportati sia commenti su una riga che su più righe, ad esempio:
search "application"
| count -- this is a single line comment
/* this is a
multi-line
comment
*/
Identificativi
Gli identificativi sono i nomi di tutte le entità disponibili nella query. Un identificativo può fare riferimento a un campo nel flusso di log corrente o a un parametro definito all'inizio della query. Gli identificativi hanno il formato seguente:
name: \$?[a-zA-Z_][a-zA-Z_0-9]*
Ad esempio: level
, app_severity
, $level
.
Il modulo citato consente simboli speciali nei nomi (tranne le virgolette doppie):
name: "[^"]+"
Ad esempio: "opc-request-id"
, "-level"
.
Tutti i riferimenti ai parametri iniziano con un simbolo del dollaro ($
), ad esempio: $level
.
Valori
Digitare | Esempi |
---|---|
stringa | 'hello', 'world\'!' |
pattern di caratteri jolly | "acc-*" |
Intero | -1, 0, +200 |
float | 1.2, 0.0001, 1.2e10 |
array | [1,2,3,4], [] |
Intervallo | 3h, 2m |
annullabile | nullo |
Funzioni
Le funzioni scalari sono le seguenti:
isnull(expr1)
concat(expr1, ...)
Le funzioni aggregate sono le seguenti:
sum(expr1)
avg(expr1)
min(expr1)
max(expr1)
count()
: conta un numero di righe.count(expr)
: conta un numero di valoriexpr
non nulli.first(expr1)
last(expr1)
Parametri di sistema
Tutti i parametri con la "query" prefex
sono riservati. Sono supportati i seguenti parametri:
Nome | Digitare | Esempio | descrizione; |
---|---|---|---|
query.from |
Stringa con data/ora in formato ISO 8601. | "2007-04-05T14:30" | Specifica l'ora di inizio della finestra di query. |
query.to |
Stringa con data/ora in ISO 8601. | '2007-04-05T14:30+05:00' | Specifica l'ora di fine della finestra di query. |