Introduzione alle query di log in Monitoraggio di Azure

Nota

Se si raccolgono dati da almeno una macchina virtuale, è possibile eseguire questo esercizio nel proprio ambiente. Per altri scenari, usare l'ambiente demo, che include molti dati di esempio.

Se si è già appreso come eseguire query in Linguaggio di query Kusto, ma è necessario creare rapidamente query utili in base ai tipi di risorse, vedere il riquadro Query di esempio salvate nell'articolo Usare query in Log Analytics di Monitoraggio di Azure.

In questa esercitazione si apprenderà come scrivere query di log in Monitoraggio di Azure. L'articolo illustra come:

  • Informazioni sulla struttura di query.
  • Ordinare i risultati della query.
  • Filtrare i risultati della query.
  • Specificare un intervallo di tempo.
  • Selezionare i campi da includere nei risultati.
  • Definire e usare campi personalizzati.
  • Aggregare e raggruppare i risultati.

Per un'esercitazione sull'uso di Log Analytics nel portale di Azure, vedere Introduzione a Log Analytics in Monitoraggio di Azure.

Per altre informazioni sulle query di log in Monitoraggio di Azure, vedere Panoramica delle query di log in Monitoraggio di Azure.

Ecco una versione video di questa esercitazione:

Scrivere una nuova 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 e migliora le prestazioni delle query e la pertinenza dei risultati.

Nota

Il linguaggio di query Kusto, 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 colonne in una query, assicurarsi di usare il caso corretto, come illustrato 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 Schema del portale di Log Analytics. Identificare una tabella a cui si è interessati e quindi esaminare alcuni dati:

SecurityEvent
| take 10

La query precedente restituisce 10 risultati dalla tabella SecurityEvent , senza un ordine specifico. Si tratta di un modo comune per esaminare una tabella e comprenderne la struttura e il contenuto. Ecco come è fatta la query:

  • La query inizia con il nome di tabella SecurityEvent, che definisce l'ambito della query.
  • Il carattere pipe (|) separa i comandi, quindi l'output del primo comando è l'input del successivo. È possibile inoltrare tramite pipe un numero qualsiasi di elementi.
  • La barra verticale è seguita dal comando take, che restituisce un numero specifico di record arbitrari dalla tabella.

È possibile eseguire la query anche senza aggiungere | take 10. Il comando sarebbe ancora valido, ma potrebbe restituire fino a 10.000 risultati.

Query di ricerca

Le query di ricerca sono meno strutturate e sono in genere più adatte per la ricerca di record che includono un valore specifico in una delle relative colonne:

search in (SecurityEvent) "Cryptographic"
| take 10

Questa query cerca nella tabella SecurityEvent i record che contengono il termine "Cryptographic". Di questi record, ne vengono restituiti e visualizzati 10. Se si omette la in (SecurityEvent) parte ed è possibile eseguire solo search "Cryptographic", la ricerca verrà eseguita su tutte le tabelle, che richiederebbe più tempo e sarà meno efficiente.

Importante

Le query di ricerca sono in genere più lente rispetto alle query basate su tabelle perché devono elaborare più dati.

Sort e top

Anche se take è utile per ottenere alcuni record, i risultati vengono selezionati e visualizzati in nessun ordine specifico. Per ottenere una visualizzazione ordinata, è possibile usare il comando sort, per ordinare i risultati in base alla colonna preferita:

SecurityEvent	
| sort by TimeGenerated desc

La query precedente potrebbe restituire troppi risultati, tuttavia, e potrebbe richiedere del tempo. La query ordina l'intera tabella SecurityEvent in base alla colonna TimeGenerated . Il portale di Analisi limita quindi la visualizzazione a soli 10.000 record. Questo approccio non è ovviamente ottimale.

Il modo migliore per ottenere solo i 10 record più recenti consiste nell'usare top, che consente di ordinare l'intera tabella sul lato server e quindi restituisce i primi record:

SecurityEvent
| top 10 by TimeGenerated

Decrescente è l'ordinamento predefinito, quindi in genere si omette l'argomento desc . L'output sarà simile al seguente:

Screenshot dei primi 10 record, ordinati in ordine decrescente.

Operatore where: filtro in base a una condizione

I filtri, come indica il loro nome, filtrano i dati in base a una condizione specifica. Questo è 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. La query seguente, ad esempio, restituisce solo i record SecurityEvent in cui Level corrisponde a 8:

SecurityEvent
| where Level == 8

Quando si scrivono 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 != ""

Per filtrare in base a più condizioni, è possibile usare uno degli approcci seguenti:

Usare e, come illustrato di seguito:

SecurityEvent
| where Level == 8 and EventID == 4672

Inviare tramite pipe più elementi, uno dopo l'altro, come illustrato di seguito:

SecurityEvent
| where Level == 8 
| where EventID == 4672

Nota

I valori possono avere tipi diversi, pertanto potrebbe essere necessario eseguirne il cast per eseguire confronti sul tipo corretto. Ad esempio, la colonna SecurityEvent Level è di tipo String, quindi è necessario eseguirne il cast a un tipo numerico, ad esempio int o long, prima di poter usare operatori numerici su di esso, come illustrato di seguito: SecurityEvent | where toint(Level) >= 10

Specificare un intervallo 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. Si tratta dell'intervallo di tempo predefinito applicato a tutte le query. Per ottenere record solo dall'ultima ora, selezionare Ultima ora e quindi eseguire di nuovo la query.

Screenshot della selezione ora e del relativo elenco di comandi di intervallo di tempo.

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", il che significa che questa query restituisce record solo dagli ultimi 30 minuti (espresso ad esempio, 30 m). Altre unità di tempo includono giorni (ad esempio, 2d) e secondi (ad esempio, 10s).

Usare il progetto ed estendere per selezionare e calcolare le colonne

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:

Screenshot dell'elenco risultati

È anche possibile usare project per rinominare le colonne e definirne di nuove. Nell'esempio seguente viene usato il progetto per eseguire le operazioni seguenti:

  • Selezionare solo le colonne originali Computer e TimeGenerated.
  • Visualizzare la colonna Activity come EventDetails.
  • Creare una nuova colonna denominata EventCode. La funzione substring() viene usata per ottenere solo i primi quattro caratteri del campo Activity.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

È possibile usare l'estensione per mantenere tutte le colonne originali nel set di risultati e definire quelle aggiuntive. La query seguente usa extend per aggiungere la colonna EventCode. Questa colonna potrebbe non essere visualizzata alla fine dei risultati della tabella, in questo caso è necessario espandere i dettagli di un record per visualizzarlo.

SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)

Usare riepilogo per aggregare gruppi di righe

Usare il riepilogo per identificare i gruppi di record in base a una o più colonne e applicare aggregazioni a tali colonne. L'uso più comune di summarize è con 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

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

Un altro uso comune consiste nell'eseguire calcoli matematici o statistici su ogni gruppo. Nell'esempio seguente viene calcolato il contatore medio per ogni computer:

Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer

Sfortunatamente, i risultati di questa query sono senza senso, perché sono stati combinati un'ampia gamma di contatori delle prestazioni. Per rendere più significativi i risultati, 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. È sufficiente riepilogare by TimeGenerated, anche se creare gruppi per ogni singolo millisecondo nell'intervallo di tempo, perché questi sono valori univoci.

Per creare gruppi basati su valori continui, è consigliabile suddividere l'intervallo in unità gestibili usando 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 == "ContosoAzADDS2" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

Per rendere più chiaro l'output, è possibile selezionarlo come grafico temporale, che mostra la memoria disponibile nel tempo:

Screenshot che mostra i valori di una memoria di query nel tempo.

Passaggi successivi