Introduzione alle query di log nei log di Monitoraggio di Azure
Questo articolo illustra i concetti fondamentali della scrittura di query di log nei log di Monitoraggio di Azure, incluse le procedure seguenti:
- Strutturare una query.
- Ordinare i risultati della query.
- Filtrare i risultati della query.
- Specificare un intervallo di tempo.
- Includere o escludere colonne nei risultati della query.
- Definire e usare campi personalizzati.
- Aggregare e raggruppare i risultati.
Se applicabile, l'articolo fornisce esempi di query sui dati usando sia Linguaggio di query Kusto (KQL) che la modalità semplice di Log Analytics.
Nota
È possibile eseguire questo esercizio nel proprio ambiente se si raccolgono dati da almeno una macchina virtuale. Per altri scenari, usare l'ambiente Demo, che include numerosi dati di esempio.
Video di esercitazione
Nota
Questo video mostra una versione precedente dell'interfaccia utente, ma gli screenshot in questo articolo sono aggiornati e riflettono l'interfaccia utente corrente.
Autorizzazioni obbligatorie
Occorrono autorizzazioni Microsoft.OperationalInsights/workspaces/query/*/read
per le aree di lavoro Log Analytics su cui si esegue la query, ad esempio le autorizzazioni fornite dal ruolo predefinito Lettore di Log Analytics.
Strutturare una query
Le query possono iniziare con un nome di tabella o con il comando search
. È consigliabile iniziare con un nome di tabella perché definisce un ambito chiaro per la query. Migliora anche le prestazioni delle query e la pertinenza dei risultati.
Nota
KQL, usato da Monitoraggio di Azure, fa distinzione tra maiuscole e minuscole. Le parole chiave del linguaggio sono in genere scritte in lettere minuscole. Quando si usano nomi di tabelle o di colonne in una query, assicurarsi di usare la giusta combinazione di maiuscole e minuscole, come indicato nel riquadro dello schema.
Query basate su tabella
Monitoraggio di Azure organizza i dati in tabelle, ognuna composta da più colonne. Tutte le tabelle e le colonne vengono visualizzate nel riquadro dello schema in Log Analytics nel portale di Azure.
Identificare una tabella a cui si è interessati, quindi esaminare alcuni dati:
SecurityEvent
| take 10
La query precedente restituisce 10 risultati dalla tabella SecurityEvent
, senza un ordine specifico. Questo modo comune per dare un'occhiata a una tabella consente di comprenderne la struttura e il contenuto. Ecco come è fatta la query:
- La query inizia con il nome della tabella
SecurityEvent
, che definisce l'ambito della query. - Il carattere di barra verticale, o pipe, (|) separa i comandi, in modo che l'output del primo comando sia l'input di quello successivo. È possibile inoltrare tramite pipe un numero qualsiasi di elementi.
- Dopo la pipe è presente l'operatore
take
. È possibile eseguire la query anche senza aggiungere| take 10
. Il comando sarebbe ancora valido, ma potrebbe restituire fino a 30.000 risultati.
Query di ricerca
Le query di ricerca sono meno strutturate. Sono più adatti per trovare record che includono un valore specifico in una delle colonne di una determinata tabella.
Questa query cerca nella SecurityEvent
tabella i record che contengono la frase "Cryptographic". Di questi record vengono restituiti e visualizzati 10 record:
search in (SecurityEvent) "Cryptographic"
| take 10
Se si omette la parte in (SecurityEvent)
ed è possibile eseguire solo search "Cryptographic"
, la ricerca viene eseguita su tutte le tabelle. Il processo richiederebbe quindi più tempo e sarebbe meno efficiente.
Importante
Le query di ricerca in genere sono più lente delle query basate su tabelle perché devono elaborare più dati.
Limitare i risultati
Utilizzare l'operatore take
per visualizzare un piccolo campione di record restituendo fino al numero specificato di record. Ad esempio:
SecurityEvent
| take 10
I risultati selezionati sono arbitrari e visualizzati in nessun ordine specifico. Se è necessario restituire risultati in un ordine specifico, usare gli sort
operatori e top
.
Ordinare i risultati
In questa sezione vengono descritti gli operatori sort
e top
e i relativi argomenti desc
e asc
. Sebbene take
sia utile per ottenere alcuni record, non è possibile selezionare o ordinare i risultati in un ordine specifico. Per ottenere una visualizzazione ordinata, usare sort
e top
.
Ordinamento
È possibile usare l'operatore sort
per ordinare i risultati della query in base alla colonna specificata. Tuttavia, sort
non limita il numero di record restituiti dalla query.
Ad esempio, la query seguente restituisce tutti i record disponibili per la tabella SecurityEvent
, fino a un massimo di 30.000 record e li ordina in base alla colonna TimeGenerated.
SecurityEvent
| sort by TimeGenerated
La query precedente potrebbe restituire troppi risultati. Inoltre, potrebbe anche essere necessario del tempo per restituire i risultati. La query ordina l'intera tabella SecurityEvent
in base alla colonna TimeGenerated
. Il portale di analisi limita quindi la visualizzazione per mostrare solo 30.000 record. Questo approccio non è ottimale. Il modo migliore per ottenere solo i record più recenti consiste nell'usare l'operatore top
.
Desc e asc
Utilizzare l'argomento desc
per ordinare i record in ordine decrescente. Decrescente è l'ordinamento predefinito per sort
e top
, quindi in genere è possibile omettere l'argomento desc
.
Ad esempio, i dati restituiti da entrambe le query seguenti vengono ordinati in base alla colonna TimeGenerated, in ordine decrescente:
-
SecurityEvent | sort by TimeGenerated desc
-
SecurityEvent | sort by TimeGenerated
Per ordinare in ordine crescente, specificare asc
.
In alto
Utilizzare l'operatore top
per ordinare l'intera tabella sul lato server e quindi restituire solo i record principali.
Ad esempio, la query seguente restituisce gli ultimi 10 record:
SecurityEvent
| top 10 by TimeGenerated
L'output è simile all'esempio seguente:
Filtrare i risultati
Il filtraggio è il modo più comune per limitare i risultati di query alle informazioni pertinenti.
Per aggiungere un filtro a una query, usare l'operatore where
seguito da una o più condizioni. Ad esempio, la query seguente restituisce solo i record SecurityEvent
in cui Level equals _8
:
SecurityEvent
| where Level == 8
Quando si scrivono le condizioni di filtro, è possibile usare le espressioni seguenti:
Expression | Descrizione | Esempio |
---|---|---|
== | Controllo dell'uguaglianza (fa distinzione tra maiuscole e minuscole) |
Level == 8 |
=~ | Controllo dell'uguaglianza (non fa distinzione tra maiuscole e minuscole) |
EventSourceName =~ "microsoft-windows-security-auditing" |
!=, <> | Controllo della disuguaglianza (entrambe le espressioni sono identiche) |
Level != 4 |
and , or |
Operatore obbligatorio tra le condizioni | Level == 16 or CommandLine != "" |
Filtrare in base a più condizioni
Per filtrare in base a più condizioni, è possibile usare uno degli approcci seguenti:
Usare and
, come illustrato di seguito:
SecurityEvent
| where Level == 8 and EventID == 4672
Inviare più elementi where
, uno dopo l'altro, come illustrato di seguito:
SecurityEvent
| where Level == 8
| where EventID == 4672
Nota
I valori possono essere di tipi diversi, quindi potrebbe essere necessario eseguire il cast per effettuare i confronti in base al tipo corretto. Ad esempio, la colonna SecurityEvent Level
è di tipo Stringa, per cui è necessario eseguire il cast a un tipo numerico, come int
o long
, per poter usare gli operatori numerici come mostrato qui: SecurityEvent | where toint(Level) >= 10
Specificare un intervallo di tempo
È possibile specificare un intervallo di tempo usando la selezione ora o un filtro temporale.
Nota
Se si include un intervallo di tempo nella query, la selezione ora cambia automaticamente in Imposta nella query. Se si modifica manualmente la selezione ora in un valore diverso, Log Analytics applica le dimensioni inferiori dei due intervalli di tempo.
Usare la selezione ora
La selezione ora viene visualizzata accanto al pulsante Esegui e indica che si eseguono query sui record solo dalle ultime 24 ore. Questo intervallo di tempo predefinito viene applicato a tutte le query. Per ottenere i record relativi soltanto all'ultima ora, selezionare Ultima ora ed eseguire di nuovo la query.
Aggiungere un filtro temporale alla query
È anche possibile definire un intervallo di tempo personalizzato aggiungendo un filtro temporale alla query.
È consigliabile posizionare il filtro temporale immediatamente dopo il nome della tabella:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
Nel filtro temporale precedente ago(30m)
significa "30 minuti fa". Questa query restituisce record degli ultimi 30 minuti, espressi come, ad esempio, 30 m. Altre unità di tempo includono giorni (ad esempio, 2d) e secondi (ad esempio, 10s).
Includere o escludere colonne nei risultati della query
Usare project
per selezionare colonne specifiche da includere nei risultati:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
L'esempio precedente genera l'output seguente:
È inoltre possibile usare project
per rinominare le colonne e definirne di nuove. L'esempio seguente usa project
per eseguire le operazioni seguenti:
- Selezionare solo le colonne originali
Computer
eTimeGenerated
. - Visualizzare la colonna
Activity
comeEventDetails
. - Creare una nuova colonna denominata
EventCode
. La funzionesubstring()
viene usata per ottenere solo i primi quattro caratteri dal campoActivity
.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Definire e usare campi personalizzati
È possibile usare extend
per mantenere tutte le colonne originali nel set di risultati e definirne altre. La query seguente usa extend
per aggiungere la colonna EventCode
. Questa colonna potrebbe non essere visualizzata alla fine dei risultati della tabella. È necessario espandere i dettagli di un record per visualizzarlo.
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
Nota
Usare l'operatore extend
per calcoli ad hoc nelle query. Usare trasformazioni in fase di inserimento o regole di riepilogo per trasformare o aggregare i dati in fase di inserimento per query più efficienti.
Aggregare e raggruppare i risultati
Aggregare gruppi di righe
Usare summarize
per identificare i gruppi di record, in base a una o più colonne, e applicarvi aggregazioni. L'uso più comune di summarize
è count
, che restituisce il numero di risultati in ogni gruppo.
La query seguente esamina tutti i record Perf
dell'ultima ora, li raggruppa in base a ObjectName
e conta i record in ogni gruppo:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
Raggruppare combinazioni univoche di valori in più colonne
In alcuni casi è opportuno definire i gruppi in base a più dimensioni. Ogni combinazione univoca di questi valori definisce un gruppo separato:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
Eseguire calcoli matematici o statistici
Un altro uso comune consiste nell'eseguire calcoli matematici o statistici su ogni gruppo. Nell'esempio seguente viene calcolata la media CounterValue
per ogni computer:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
Sfortunatamente, i risultati di questa query non sono significativi perché combinano i valori di diversi contatori delle prestazioni. Per rendere i risultati più significativi, calcolare la media separatamente per ogni combinazione di CounterName
e Computer
:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
Riepilogare in base a una colonna temporale
Il raggruppamento dei risultati può anche essere basato su una colonna temporale o un altro valore continuo. Un semplice riepilogo di tipo by TimeGenerated
, tuttavia, creerebbe gruppi per ogni singolo millisecondo nell'intervallo di tempo, poiché si tratta di valori univoci.
Per creare gruppi basati su valori continui, è consigliabile suddividere l'intervallo in unità gestibili tramite bin
. La query seguente analizza i record Perf
che misurano la memoria libera (Available MBytes
) in un computer specifico. Calcola il valore medio di ogni periodo di 1 ora negli ultimi 7 giorni:
Perf
| where TimeGenerated > ago(7d)
| where Computer == "DC01.na.contosohotels.com"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
Per rendere più chiaro l'output, è possibile selezionare di visualizzarlo come un grafico temporale, che mostra la memoria disponibile nel tempo. A tale scopo, passare alla visualizzazione Grafico , aprire la barra laterale Formattazione grafico a destra e selezionare Linea per Tipo di grafico:
Domande frequenti
Questa sezione fornisce le risposte alle domande comuni.
Perché vengono visualizzati record duplicati nei log di Monitoraggio di Azure?
In alcuni casi, è possibile notare record duplicati in Log di Monitoraggio di Azure. Questa duplicazione è in genere da una delle due condizioni seguenti:
- I componenti della pipeline hanno nuovi tentativi per garantire un recapito affidabile nella destinazione. In alcuni casi, questa funzionalità potrebbe comportare duplicati per una piccola percentuale di elementi di telemetria.
- Se i record duplicati provengono da una macchina virtuale, potrebbe essere installato sia l'agente di Log Analytics che l'agente di Monitoraggio di Azure. Se è ancora necessario installare l'agente di Log Analytics, configurare l'area di lavoro di Log Analytics per non raccogliere più i dati raccolti anche dalla regola di raccolta dati usata dall'agente di Monitoraggio di Azure.
Passaggi successivi
- Per altre informazioni sull'uso di dati stringa in una query di log, vedere Usare le stringhe nelle query di log di Monitoraggio di Azure.
- Per altre informazioni sull'aggregazione di dati in una query di log, vedere Aggregazioni avanzate nelle query dei log di Monitoraggio di Azure.
- Per informazioni su come aggiungere dati di più tabelle, vedere Join nelle query di log di Monitoraggio di Azure.
- Per la documentazione sull'intero Linguaggio di query Kusto, vedere Informazioni di riferimento sul linguaggio KQL.