Introduzione alle query di log in Monitoraggio di AzureGet started with Azure Monitor log queries

Nota

È consigliabile completare Introduzione a Azure Monitor Log Analitica prima di completare questa esercitazione.You should complete Get started with Azure Monitor Log Analytics before completing this tutorial.

Nota

È possibile eseguire questo esercizio nel proprio ambiente di Log Analytics oppure è possibile usare l' ambiente di dimostrazione, che include moltissimi dati di esempio.You can work through this exercise in your own Log Analytics environment, or you can use our Demo environment, which includes plenty of sample data.

In questa esercitazione si apprenderà come scrivere query di log di monitoraggio di Azure.In this tutorial you will learn to write Azure Monitor log queries. Si apprenderà come:It will teach you how to:

  • Comprendere la struttura delle queryUnderstand queries' structure
  • Ordinare i risultati di querySort query results
  • Filtrare i risultati di queryFilter query results
  • Specificare un intervallo di tempoSpecify a time range
  • Selezionare i campi da includere nei risultatiSelect which fields to include in the results
  • Definire e usare campi personalizzatiDefine and use custom fields
  • Aggregare e raggruppare i risultatiAggregate and group results

Scrittura di una nuova queryWriting a new query

Le query possono iniziare con un nome di tabella o con il comando search.Queries can start with either a table name or the search command. È consigliabile iniziare con un nome di tabella, perché definisce un chiaro ambito per la query e consente di migliorare sia le prestazioni di query che la pertinenza dei risultati.You should start with a table name, since it defines a clear scope for the query and improves both query performance and relevance of the results.

Nota

Il linguaggio di query Kusto usato da Monitoraggio di Azure fa distinzione tra maiuscole e minuscole.The Kusto query language used by Azure Monitor is case-sensitive. Le parole chiave del linguaggio sono in genere scritte in lettere minuscole.Language keywords are typically written in lower-case. 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.When using names of tables or columns in a query, make sure to use the correct case, as shown on the schema pane.

Query basate su tabellaTable-based queries

Monitoraggio di Azure organizza i dati in tabelle, ognuna composta da più colonne.Azure Monitor organizes log data in tables, each composed of multiple columns. Tutte le tabelle e le colonne vengono visualizzate nel riquadro Schema del portale di Log Analytics.All tables and columns are shown on the schema pane in Log Analytics in the Analytics portal. Identificare una tabella di interesse ed esaminarne i dati:Identify a table that you're interested in and then take a look at a bit of data:

SecurityEvent
| take 10

La query precedente restituisce 10 risultati dalla tabella SecurityEvent, senza alcun ordine specifico.The query shown above returns 10 results from the SecurityEvent table, in no specific order. Si tratta di un modo molto comune per esaminare a grandi linee una tabella e comprenderne struttura e contenuto.This is a very common way to take a glance at a table and understand its structure and content. Ecco come è fatta la query:Let's examine how it's built:

  • La query inizia con il nome di tabella SecurityEvent, che definisce l'ambito della query.The query starts with the table name SecurityEvent - this part defines the scope of the query.
  • Il carattere di barra verticale, o pipe, (|) separa i comandi, in modo che l'output del primo comando sia l'input del comando successivo.The pipe (|) character separates commands, so the output of the first one in the input of the following command. È possibile inoltrare tramite pipe un numero qualsiasi di elementi.You can add any number of piped elements.
  • La barra verticale è seguita dal comando take, che restituisce un numero specifico di record arbitrari dalla tabella.Following the pipe is the take command, which returns a specific number of arbitrary records from the table.

Sarebbe stato possibile eseguire la query anche senza aggiungere | take 10. La query sarebbe comunque valida, ma potrebbe restituire fino a 10.000 risultati.We could actually run the query even without adding | take 10 - that would still be valid, but it could return up to 10,000 results.

Query di ricercaSearch queries

Le query di ricerca sono meno strutturate e in genere più appropriate per trovare record che includono un valore specifico in una delle relative colonne:Search queries are less structured, and generally more suited for finding records that include a specific value in any of their columns:

search in (SecurityEvent) "Cryptographic"
| take 10

Questa query cerca nella tabella SecurityEvent i record che contengono il termine "Cryptographic".This query searches the SecurityEvent table for records that contain the phrase "Cryptographic". Di questi record, ne vengono restituiti e visualizzati 10.Of those records, 10 records will be returned and displayed. Se si omette la parte in (SecurityEvent) e si esegue solamente il comando search "Cryptographic", la ricerca viene eseguita in tutte le tabelle e quindi richiede più tempo ed è meno efficiente.If we omit the in (SecurityEvent) part and just run search "Cryptographic", the search will go over all tables, which would take longer and be less efficient.

Nota

Per impostazione predefinita, viene usato un intervallo di tempo corrispondente alle ultime 24 ore.By default, a time range of last 24 hours is set. Per usare un intervallo diverso, usare il controllo di selezione di data e ora (che si trova vicino al pulsante Vai) o aggiungere alla query un filtro di intervallo di tempo esplicito.To use a different range, use the time-picker (located next to the Go button) or add an explicit time range filter to your query.

Sort e topSort and top

Sebbene take sia utile per ottenere pochi record, i risultati vengono selezionati e visualizzati senza alcun ordine particolare.While take is useful to get a few records, the results are selected and displayed in no particular order. Per ottenere una visualizzazione ordinata, è possibile usare il comando sort, per ordinare i risultati in base alla colonna preferita:To get an ordered view, you could sort by the preferred column:

SecurityEvent   
| sort by TimeGenerated desc

In questo modo, tuttavia, possono venire restituiti troppi risultati e la query potrebbe richiedere tempo.That could return too many results though and might also take some time. La query precedente ordina l'intera tabella SecurityEvent in base alla colonna TimeGenerated.The above query sorts the entire SecurityEvent table by the TimeGenerated column. Il portale di analisi limita quindi la visualizzazione per mostrare solo 10.000 record.The Analytics portal then limits the display to show only 10,000 records. Questo approccio non è ovviamente ottimale.This approach is of course not optimal.

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:The best way to get only the latest 10 records is to use top, which sorts the entire table on the server side and then returns the top records:

SecurityEvent
| top 10 by TimeGenerated

L'ordine decrescente rappresenta il tipo di ordinamento predefinito, quindi in genere l'argomento desc viene omesso. L'output avrà un aspetto simile al seguente:Descending is the default sorting order, so we typically omit the desc argument.The output will look like this:

Primi 10 elementi

Where: filtro in base a una condizioneWhere: filtering on a condition

I filtri, come indica il loro nome, filtrano i dati in base a una condizione specifica.Filters, as indicated by their name, filter the data by a specific condition. Questo è il modo più comune per limitare i risultati di query alle informazioni pertinenti.This is the most common way to limit query results to relevant information.

Per aggiungere un filtro a una query, usare l'operatore where seguito da una o più condizioni.To add a filter to a query, use the where operator followed by one or more conditions. La query seguente, ad esempio, restituisce solo i record SecurityEvent in cui Level corrisponde a 8:For example, the following query returns only SecurityEvent records where Level equals 8:

SecurityEvent
| where Level == 8

Quando si scrivono le condizioni di filtro, è possibile usare le espressioni seguenti:When writing filter conditions, you can use the following expressions:

ExpressionExpression DESCRIZIONEDescription EsempioExample
== Controllo dell'uguaglianzaCheck equality
(fa distinzione tra maiuscole e minuscole)(case-sensitive)
Level == 8
=~ Controllo dell'uguaglianzaCheck equality
(non fa distinzione tra maiuscole e minuscole)(case-insensitive)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <>!=, <> Controllo della disuguaglianzaCheck inequality
(entrambe le espressioni sono identiche)(both expressions are identical)
Level != 4
and, orand, or Operatori richiesti tra le condizioniRequired between conditions Level == 16 or CommandLine != ""

Per filtrare in base a più condizioni, è possibile usare and:To filter by multiple conditions, you can either use and:

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

oppure inoltrare tramite pipe più elementi where, uno dopo l'altro:or pipe multiple where elements one after the other:

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

Nota

I valori possono essere di tipi diversi, quindi potrebbe essere necessario eseguire il cast per effettuare il confronto in base al tipo corretto.Values can have different types, so you might need to cast them to perform comparison on the correct type. Ad esempio, la colonna Level di SecurityEvent è di tipo String, quindi è necessario eseguire il cast a un tipo numerico, come int o long, per poter usare gli operatori numerici: SecurityEvent | where toint(Level) >= 10For example, SecurityEvent Level column is of type String, so you must cast it to a numerical type such as int or long, before you can use numerical operators on it: SecurityEvent | where toint(Level) >= 10

Specificare un intervallo di tempoSpecify a time range

Controllo di selezione di data e oraTime picker

Il controllo di selezione di data e ora si trova accanto al pulsante Esegui e indica che viene eseguita una query solo sui record delle ultime 24 ore.The time picker is next to the Run button and indicates we’re querying only records from the last 24 hours. Si tratta dell'intervallo di tempo predefinito applicato a tutte le query.This is the default time range applied to all queries. Per ottenere solo i record dall'ultima ora, selezionare Ultima ora ed eseguire di nuovo la query.To get only records from the last hour, select Last hour and run the query again.

Selezione ora

Filtro temporale nella queryTime filter in query

È anche possibile definire un intervallo di tempo personalizzato aggiungendo un filtro temporale alla query.You can also define your own time range by adding a time filter to the query. È consigliabile posizionare il filtro temporale immediatamente dopo il nome della tabella:It’s best to place the time filter immediately after the table name:

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

Nel filtro temporale precedente, ago(30m) indica "30 minuti fa", quindi la query restituisce solo i record degli ultimi 30 minuti.In the above time filter ago(30m) means "30 minutes ago" so this query only returns records from the last 30 minutes. Altre unità di tempo includono giorni (2d), minuti (25m) e secondi (10s).Other units of time include days (2d), minutes (25m), and seconds (10s).

Project ed extend: selezionare e calcolare le colonneProject and Extend: select and compute columns

Usare project per selezionare colonne specifiche da includere nei risultati:Use project to select specific columns to include in the results:

SecurityEvent 
| top 10 by TimeGenerated 
| project TimeGenerated, Computer, Activity

L'esempio precedente genera l'output seguente:The preceding example generates this output:

Risultati della query project

È anche possibile usare project per rinominare le colonne e definirne di nuove.You can also use project to rename columns and define new ones. L'esempio seguente usa il comando project per questi scopi:The following example uses project to do the following:

  • Selezionare solo le colonne originali Computer e TimeGenerated.Select only the Computer and TimeGenerated original columns.
  • Rinominare la colonna Activity in EventDetails.Rename the Activity column to EventDetails.
  • Creare una nuova colonna denominata EventCode.Create a new column named EventCode. La funzione substring() viene usata per ottenere solo i primi quattro caratteri del campo Activity.The substring() function is used to get only the first four characters from the Activity field.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

Il comando extend mantiene tutte le colonne originali nel set di risultati e definisce colonne aggiuntive.extend keeps all original columns in the result set and defines additional ones. La query seguente usa extend per aggiungere una colonna localtime che contiene un valore TimeGenerated localizzato.The following query uses extend to add a localtime column, which contains a localized TimeGenerated value.

SecurityEvent
| top 10 by TimeGenerated
| extend localtime = TimeGenerated-8h

Summarize: aggregare gruppi di righeSummarize: aggregate groups of rows

Usare summarize per identificare i gruppi di record, in base a una o più colonne, e applicarvi aggregazioni.Use summarize to identify groups of records, according to one or more columns, and apply aggregations to them. L'uso più comune di summarize è con count, che restituisce il numero di risultati in ogni gruppo.The most common use of summarize is count, which returns the number of results in each group.

La query seguente esamina tutti i record Perf dell'ultima ora, li raggruppa in base a ObjectName e conta i record in ogni gruppo:The following query reviews all Perf records from the last hour, groups them by ObjectName, and counts the records in each group:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName

In alcuni casi è opportuno definire i gruppi in base a più dimensioni.Sometimes it makes sense to define groups by multiple dimensions. Ogni combinazione univoca di questi valori definisce un gruppo separato:Each unique combination of these values defines a separate group:

Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName

Un altro uso comune consiste nell'eseguire calcoli matematici o statistici su ogni gruppo.Another common use is to perform mathematical or statistical calculations on each group. Ad esempio, di seguito viene calcolata la media di CounterValue per ogni computer:For example, the following calculates the average CounterValue for each 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.Unfortunately, the results of this query are meaningless since we mixed together different performance counters. Per renderli più significativi, è necessario calcolare la media separatamente per ogni combinazione di CounterName e Computer:To make this more meaningful, we should calculate the average separately for each combination of CounterName and Computer:

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

Riepilogare in base a una colonna temporaleSummarize by a time column

Il raggruppamento dei risultati può anche essere basato su una colonna temporale o un altro valore continuo.Grouping results can also be based on a time column, or another continuous value. Un semplice riepilogo di tipo by TimeGenerated, tuttavia, creerebbe gruppi per ogni singolo millisecondo nell'intervallo di tempo, poiché si tratta di valori univoci.Simply summarizing by TimeGenerated though would create groups for every single millisecond over the time range, since these are unique values.

Per creare gruppi basati su valori continui, è consigliabile suddividere l'intervallo in unità gestibili tramite bin.To create groups based on continuous values, it is best to break the range into manageable units using bin. La query seguente analizza i record Perf che misurano la memoria libera (Available MBytes) in un computer specifico.The following query analyzes Perf records that measure free memory (Available MBytes) on a specific computer. Calcola il valore medio per ogni periodo di 1 ora, negli ultimi 7 giorni:It calculates the average value for each period if 1 hour, over the last 7 days:

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, visualizzarlo come un grafico temporale, che mostra la memoria disponibile nel tempo:To make the output clearer, you select to display it as a time-chart, showing the available memory over time:

Query relativa alla memoria disponibile nel tempo

Passaggi successiviNext steps