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

Per iniziare la ricerca, è innanzitutto necessario definire il set di log da cercare. Puoi scegliere di cercare oggetti di log, gruppi di log o compartimenti specifici. È possibile combinare e abbinare tutti i log necessari. L'ambito di ricerca viene definito utilizzando il seguente pattern:
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

Tutti i campi nei flussi di log fanno distinzione tra casi. Sebbene i log effettivi abbiano campi indicizzati solo in lettere minuscole, è anche possibile creare nuovi campi nella query con lettere maiuscole e minuscole:
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).

Il lato sinistro diventa il "flusso corrente" per l'espressione del lato destro, rendendo tutti i campi nel flusso corrente disponibili in base ai nomi brevi. Ad esempio:
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

Quando si eseguono query avanzate, sono supportati i seguenti elementi:

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.

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
Recupera solo un numero specificato di righe dal flusso di log corrente, ordinate in base a un'espressione.
<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 valori expr 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.