Introduzione alle query su 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 (KQL), ma è necessario creare rapidamente query utili in base ai tipi di risorse, vedere il riquadro Query di esempio salvate in 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 delle 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:

Autorizzazioni obbligatorie

È necessario disporre Microsoft.OperationalInsights/workspaces/query/*/read delle autorizzazioni per le aree di lavoro Log Analytics su cui si esegue la query, ad esempio, come specificato dal ruolo predefinito Lettore di Log Analytics.

Scrivere una nuova query

Le query possono iniziare con un nome di tabella o con il search comando . È 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 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 SecurityEvent tabella, 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 SecurityEventdella tabella , che definisce l'ambito della query.

  • Il carattere pipe (|) separa i comandi, quindi l'output del primo comando è l'input della successiva. È 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.

Take

Utilizzare l'operatore take per visualizzare un piccolo campione di record restituendo fino al numero specificato di record. 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 .

Query di ricerca

Le query di ricerca sono meno strutturate. Sono più adatti per trovare record che includono un valore specifico in una delle relative colonne:

search in (SecurityEvent) "Cryptographic"
| take 10

Questa query cerca nella SecurityEvent tabella i record che contengono la frase "Cryptographic". Di questi record vengono restituiti e visualizzati 10 record. Se si omette la in (SecurityEvent) parte 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 sono in genere più lente rispetto alle query basate su tabelle perché devono elaborare più dati.

Sort e top

In questa sezione vengono descritti gli sort operatori e top e i relativi desc argomenti 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.

Desc e asc

Desc

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
    

Asc

Per ordinare in ordine crescente, specificare asc.

Ordinamento

È possibile usare l'operatore sort. sort ordina 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 SecurityEvent tabella, 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 SecurityEvent tabella in base alla TimeGenerated colonna. Il portale di Analisi limita quindi la visualizzazione a soli 30.000 record. Questo approccio non è ottimale. Il modo migliore per ottenere solo i record più recenti consiste nell'usare l'operatore top.

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 i 10 record più recenti:

SecurityEvent
| top 10 by TimeGenerated

L'output è simile a questo esempio.

Screenshot that shows the top 10 records sorted in descending order.

Operatore where: Filtrare in base a una condizione

I filtri, come indica il loro nome, filtrano i dati in base a una condizione specifica. Il filtro è il modo più comune per limitare i risultati delle 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 SecurityEvent i record in cui Level equals _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 and, come illustrato di seguito:

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

Inviare più where 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 SecurityEvent Level colonna è 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

È possibile specificare un intervallo di tempo usando la selezione ora o un filtro temporale.

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 record solo dall'ultima ora, selezionare Ultima ora e quindi eseguire di nuovo la query.

Screenshot that shows the time picker and its list of time-range commands.

Aggiungere un filtro temporale alla query

È anche possibile definire un intervallo di tempo personalizzato aggiungendo un filtro temporale alla query. L'aggiunta di un filtro ora sostituisce l'intervallo di tempo selezionato nella selezione ora.

È consigliabile inserire il filtro ora immediatamente dopo il nome della tabella:

SecurityEvent
| where TimeGenerated > ago(30m) 
| where toint(Level) >= 10

Nel filtro temporale precedente significa ago(30m) "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).

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 that shows the query 'project' results list.

È anche possibile usare project per rinominare le colonne e definirne di nuove. L'esempio seguente usa project per eseguire le operazioni seguenti:

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

È possibile usare extend per mantenere tutte le colonne originali nel set di risultati e definirne altre. La query seguente usa extend per aggiungere la EventCode colonna . 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)

Usare summarize per aggregare gruppi di righe

Usare summarize per identificare i gruppi di record in base a una o più colonne e applicare le aggregazioni. L'uso più comune di summarize è count, che restituisce il numero di risultati in ogni gruppo.

La query seguente esamina tutti i Perf record dell'ultima ora, li raggruppa per ObjectNamee 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 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é sono stati combinati contatori delle prestazioni diversi. 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

I risultati del raggruppamento possono anche essere basati su una colonna temporale o su un altro valore continuo. Riepilogando by TimeGeneratedsemplicemente , tuttavia, creare gruppi per ogni singolo millisecondo nell'intervallo di tempo perché questi valori sono univoci.

Per creare gruppi basati su valori continui, è consigliabile suddividere l'intervallo in unità gestibili usando bin. La query seguente analizza i Perf record 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 that shows the values of a query memory over time.

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 nei 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 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 stringhe nelle query di log di Monitoraggio di Azure.
  • Per altre informazioni sull'aggregazione dei dati in una query di log, vedere Aggregazioni avanzate nelle query di log di Monitoraggio di Azure.
  • Per informazioni su come unire dati da più tabelle, vedere Join nelle query di log di Monitoraggio di Azure.
  • Ottenere la documentazione sull'intero Linguaggio di query Kusto nelle informazioni di riferimento sul linguaggio KQL.