Aan de slag met Logboeken-query's in Azure MonitorGet started with log queries in Azure Monitor

Notitie

U moet voltooien aan de slag met Azure Monitor Log-Analytics voordat het voltooien van deze zelfstudie.You should complete Get started with Azure Monitor Log Analytics before completing this tutorial.

Notitie

U kunt via deze oefening werkt in uw eigen omgeving Log Analytics, of kunt u onze Demo-omgeving, waaronder volop voorbeeldgegevens.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 deze zelfstudie leert u Logboeken-query's schrijven in Azure Monitor.In this tutorial you will learn to write log queries in Azure Monitor. Deze leert u hoe aan:It will teach you how to:

  • Inzicht in query-structuurUnderstand query structure
  • Query-resultaten sorterenSort query results
  • Filter de resultaten van queryFilter query results
  • Een tijdsperiode opgevenSpecify a time range
  • Welke velden moeten worden opgenomen in de resultatenSelect which fields to include in the results
  • Definiëren en gebruiken van aangepaste veldenDefine and use custom fields
  • Cumulatieve en groep-resultatenAggregate and group results

Zie voor een zelfstudie over het gebruik van Log Analytics in Azure portal, aan de slag met Azure Monitor Log-Analytics.For a tutorial on using Log Analytics in the Azure portal, see Get started with Azure Monitor Log Analytics.
Zie voor meer informatie over de logboeken-query's in Azure Monitor overzicht van het logboek query's in Azure Monitor.For more details on log queries in Azure Monitor, see Overview of log queries in Azure Monitor.

Een nieuwe query schrijvenWriting a new query

Query's kunnen beginnen met ofwel een tabelnaam wordt opgegeven of de zoeken opdracht.Queries can start with either a table name or the search command. U moet beginnen met een tabelnaam wordt opgegeven, omdat deze een duidelijke bereik voor de query wordt gedefinieerd en verbetert de prestaties van query's zowel relevantie van de resultaten.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.

Notitie

De Kusto-query-taal die wordt gebruikt door Azure Monitor is hoofdlettergevoelig.The Kusto query language used by Azure Monitor is case-sensitive. Trefwoorden voor de taal worden doorgaans intern kleine letters.Language keywords are typically written in lower-case. Wanneer u de namen van tabellen of kolommen in een query, zorg ervoor dat u het juiste geval is, zoals wordt weergegeven in het deelvenster 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's op basis van een tabelTable-based queries

Azure Monitor organiseert logboekgegevens in tabellen, elk bestaat uit meerdere kolommen.Azure Monitor organizes log data in tables, each composed of multiple columns. Alle tabellen en kolommen worden weergegeven in het deelvenster schema in Log Analytics in de Analytics-portal.All tables and columns are shown on the schema pane in Log Analytics in the Analytics portal. Identificeert een tabel die u geïnteresseerd bent en klikt u vervolgens Kijk eens een deel van de gegevens:Identify a table that you're interested in and then take a look at a bit of data:

SecurityEvent
| take 10

De bovenstaande query retourneert 10 resultaten van de SecurityEvent tabel in een specifieke volgorde.The query shown above returns 10 results from the SecurityEvent table, in no specific order. Dit is een veelgebruikte manier een blik op een tabel en inzicht in de structuur en inhoud.This is a very common way to take a glance at a table and understand its structure and content. We bekijken hoe deze wordt gemaakt:Let's examine how it's built:

  • De query wordt gestart met de naam van de tabel SecurityEvent -in dit gedeelte definieert u het bereik van de query.The query starts with the table name SecurityEvent - this part defines the scope of the query.
  • Het sluisteken (|) opdrachten zijn gescheiden, zodat de uitvoer van het eerste item in de invoer van de volgende opdracht.The pipe (|) character separates commands, so the output of the first one in the input of the following command. U kunt een willekeurig aantal doorgesluisd elementen kunt toevoegen.You can add any number of piped elements.
  • Na de pipe is de nemen opdracht, waarbij een bepaald aantal willekeurige records geretourneerd uit de tabel.Following the pipe is the take command, which returns a specific number of arbitrary records from the table.

We kunnen de query daadwerkelijk uitvoeren zelfs zonder toe te voegen | take 10 : die nog steeds geldig zou zijn, maar het kan maximaal 10.000 resultaten worden geretourneerd.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.

Zoekquery 'sSearch queries

Zoekquery's zijn minder gestructureerde en doorgaans meer geschikt is voor het zoeken van records die een specifieke waarde in een van de kolommen bevatten: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

Deze query zoekt naar de SecurityEvent tabel voor records die de zin 'Cryptografische' bevatten.This query searches the SecurityEvent table for records that contain the phrase "Cryptographic". Deze records worden 10 records geretourneerd en weergegeven.Of those records, 10 records will be returned and displayed. Als we weglaat de in (SecurityEvent) deel en alleen worden uitgevoerd search "Cryptographic", de zoekopdracht gaat over alle tabellen die langer duren en minder efficiënt.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.

Waarschuwing

Zoekquery's zijn doorgaans langzamer dan query's op basis van een tabel, omdat ze hebben om meer gegevens te verwerken.Search queries are typically slower than table-based queries because they have to process more data.

Sorteren en topSort and top

Terwijl nemen is handig om een paar records, de resultaten zijn geselecteerd en wordt weergegeven in willekeurige volgorde.While take is useful to get a few records, the results are selected and displayed in no particular order. Als u een geordende weergeven, kunt u sorteren door de gewenste kolom:To get an ordered view, you could sort by the preferred column:

SecurityEvent   
| sort by TimeGenerated desc

Die al te veel resultaten kan worden geretourneerd en kan ook enige tijd duren.That could return too many results though and might also take some time. De bovenstaande query sorteert het gehele SecurityEvent tabel door de kolom TimeGenerated.The above query sorts the entire SecurityEvent table by the TimeGenerated column. De Analytics-portal beperkt vervolgens de weergave alleen 10.000 records wilt weergeven.The Analytics portal then limits the display to show only 10,000 records. Deze aanpak is natuurlijk niet optimaal.This approach is of course not optimal.

De beste manier om op te halen, alleen de meest recente 10 records is met boven, die de hele tabel aan de serverzijde sorteert en retourneert vervolgens de bovenste records: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

Aflopend is de standaardinstelling sorteervolgorde, zodat we meestal laat de desc argument. De uitvoer ziet er als volgt:Descending is the default sorting order, so we typically omit the desc argument.The output will look like this:

Top 10

Waar: filteren op een voorwaardeWhere: filtering on a condition

Filters, zoals aangegeven door de naam, filteren de gegevens door een specifieke voorwaarde.Filters, as indicated by their name, filter the data by a specific condition. Dit is de meest voorkomende manier om te beperken van de queryresultaten naar relevante informatie.This is the most common way to limit query results to relevant information.

U kunt een filter toevoegen aan een query met de waar operator gevolgd door een of meer voorwaarden.To add a filter to a query, use the where operator followed by one or more conditions. De volgende query retourneert bijvoorbeeld alleen SecurityEvent records waarin niveau gelijk is aan 8:For example, the following query returns only SecurityEvent records where Level equals 8:

SecurityEvent
| where Level == 8

Bij het schrijven van de filtervoorwaarden, kunt u de volgende expressies:When writing filter conditions, you can use the following expressions:

expressieExpression DescriptionDescription VoorbeeldExample
== Gelijkheid controlerenCheck equality
(hoofdlettergevoelig)(case-sensitive)
Level == 8
=~ Gelijkheid controlerenCheck equality
(niet hoofdlettergevoelig)(case-insensitive)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <>!=, <> Ongelijkheid controlerenCheck inequality
(beide expressies zijn identiek)(both expressions are identical)
Level != 4
en, ofand, or Vereist tussen de voorwaardenRequired between conditions Level == 16 or CommandLine != ""

Als u wilt filteren op meerdere voorwaarden, kunt u ofwel en:To filter by multiple conditions, you can either use and:

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

of meerdere overbrengen waar elementen een na de andere:or pipe multiple where elements one after the other:

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

Notitie

Waarden hebben verschillende typen, zodat u wellicht te gieten om uit te voeren vergelijking op het juiste type.Values can have different types, so you might need to cast them to perform comparison on the correct type. Bijvoorbeeld, SecurityEvent niveau kolom is van het type String, zodat u cast-conversie moet deze naar een numeriek type zoals int of lang, voordat u de numerieke operators erop kunt gebruiken: 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

Een tijdsperiode opgevenSpecify a time range

TijdkiezerTime picker

De tijdkiezer naast de knop uitvoeren en geeft aan dat we bij het opvragen van alleen de records van de afgelopen 24 uur.The time picker is next to the Run button and indicates we’re querying only records from the last 24 hours. Dit is het tijdsbereik voor standaard toegepast op alle query's.This is the default time range applied to all queries. Als u alleen de records van het afgelopen uur, selecteer afgelopen uur en voer de query opnieuw uit.To get only records from the last hour, select Last hour and run the query again.

Tijdkiezer

Tijdfilter in queryTime filter in query

U kunt ook uw eigen tijdsbereik definiëren door een time-filter toe te voegen aan de query.You can also define your own time range by adding a time filter to the query. Het is raadzaam te plaatsen van het tijdfilter direct na de naam van de tabel:It’s best to place the time filter immediately after the table name:

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

In het bovenstaande tijdfilter ago(30m) "30 minuten geleden" betekent, zodat deze query alleen records uit de laatste 30 minuten retourneert.In the above time filter ago(30m) means "30 minutes ago" so this query only returns records from the last 30 minutes. Andere tijdseenheden inclusief dagen (2d), minuten (25m) en seconden (per 10).Other units of time include days (2d), minutes (25m), and seconds (10s).

Project en uitbreiden: Selecteer en kolommen berekenenProject and Extend: select and compute columns

Gebruik project om specifieke kolommen om op te nemen in de resultaten te selecteren:Use project to select specific columns to include in the results:

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

Het vorige voorbeeld wordt deze uitvoer gegenereerd:The preceding example generates this output:

De resultaten van de query-project

U kunt ook project namen van kolommen wijzigen en nieuwe te definiëren.You can also use project to rename columns and define new ones. Project wordt het volgende voorbeeld het volgende doen:The following example uses project to do the following:

  • Selecteer alleen de Computer en TimeGenerated oorspronkelijke kolommen.Select only the Computer and TimeGenerated original columns.
  • Wijzig de naam van de activiteit kolom EventDetails.Rename the Activity column to EventDetails.
  • Maak een nieuwe kolom met de naam EventCode.Create a new column named EventCode. De substring() functie wordt gebruikt om op te halen van alleen de eerste vier tekens van het veld activiteit.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)

uitbreiden houdt u alle oorspronkelijke kolommen in de resultatenset en nieuwe zijn in definieert.extend keeps all original columns in the result set and defines additional ones. De volgende query gebruikt uitbreiden om toe te voegen de EventCode kolom.The following query uses extend to add the EventCode column. Houd er rekening mee dat deze kolom kan niet worden weergegeven aan het einde van de resultaten van de tabel in dat geval u moet om uit te breiden de details van een record weer te geven.Note that this column may not display at the end of the table results in which case you would need to expand the details of a record to view it.

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

Samenvatting: Rijgroepen samenvoegenSummarize: aggregate groups of rows

Gebruik samenvatten identificeren groepen records, op basis van een of meer kolommen en aggregaties op hen van toepassing.Use summarize to identify groups of records, according to one or more columns, and apply aggregations to them. De meest voorkomende gebruik van samenvatten is aantal, die het aantal resultaten retourneert in elke groep.The most common use of summarize is count, which returns the number of results in each group.

De volgende query controleert alle voor prestaties records van het afgelopen uur, gegroepeerd door ObjectName, en de records in elke groep telt: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

Soms is het handig om groepen te definiëren voor meerdere dimensies.Sometimes it makes sense to define groups by multiple dimensions. Elke unieke combinatie van deze waarden worden gedefinieerd voor een afzonderlijke groep:Each unique combination of these values defines a separate group:

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

Er is een ander algemeen gebruik wiskundige of statistische berekeningen uitvoeren op elke groep.Another common use is to perform mathematical or statistical calculations on each group. Bijvoorbeeld, het volgende wordt het gemiddelde wordt berekend CounterValue voor elke computer:For example, the following calculates the average CounterValue for each computer:

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

De resultaten van deze query zijn helaas geen betekenis heeft, omdat we verschillende prestatiemeters vermengd.Unfortunately, the results of this query are meaningless since we mixed together different performance counters. Om dit meer af te stemmen, moeten we de gemiddelde afzonderlijk voor elke combinatie van berekenen CounterName en 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

Samenvatten op een time-kolomSummarize by a time column

Resultaten groeperen kan ook worden gebaseerd op een time-kolom, of een andere continue waarde.Grouping results can also be based on a time column, or another continuous value. Samenvatting van gewoon by TimeGenerated echter zou groepen maken voor elke één milliseconde gedurende het tijdsbereik, omdat dit unieke waarden zijn.Simply summarizing by TimeGenerated though would create groups for every single millisecond over the time range, since these are unique values.

Voor het maken van groepen op basis van doorlopende waarden, het is raadzaam om het bereik in beheerbare eenheden met behulp van bin.To create groups based on continuous values, it is best to break the range into manageable units using bin. De volgende query worden geanalyseerd Perf records die het meten van beschikbaar geheugen (beschikbare megabytes (MB) ) op een specifieke computer.The following query analyzes Perf records that measure free memory (Available MBytes) on a specific computer. De gemiddelde waarde van elke periode van één uur wordt berekend in de afgelopen 7 dagen:It calculates the average value of each 1 hour period over the last 7 days:

Perf 
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

Als u de uitvoer duidelijker, schakelt u weer te geven als een tijdgrafiek van het beschikbare geheugen na verloop van tijd:To make the output clearer, you select to display it as a time-chart, showing the available memory over time:

Querygeheugen na verloop van tijd

Volgende stappenNext steps