Aan de slag met logboekquery’s in Azure Monitor

Notitie

Als u gegevens verzamelt van ten minste één virtuele machine, kunt u deze oefening in uw eigen omgeving doen. Gebruik voor andere scenario's onze demo-omgeving, die veel voorbeeldgegevens bevat.

Zie het deelvenster Opgeslagen voorbeeldquery's in het artikel Query's gebruiken in Azure Monitor Log Analytics als u al weet hoe u query's uitvoert in Kusto Query Language, maar snel nuttige query's moet maken op basis van resourcetypen.

In deze zelfstudie leert u hoe u logboekquery's kunt schrijven in Azure Monitor. In dit artikel leert u het volgende:

  • Querystructuur begrijpen.
  • Queryresultaten sorteren.
  • Queryresultaten filteren.
  • Geef een tijdsbereik op.
  • Selecteer welke velden u wilt opnemen in de resultaten.
  • Aangepaste velden definiëren en gebruiken.
  • Resultaten aggregeren en groepen.

Raadpleeg Aan de slag met Azure Monitor Log Analytics voor een zelfstudie over het gebruik van Log Analytics in de Azure Portal.

Zie Overzicht van logboekquery's in Azure Monitor voor meer informatie over logboekquery'Azure Monitor.

Hier is een videoversie van deze zelfstudie:

Een nieuwe query schrijven

Query's kunnen beginnen met een tabelnaam of de opdracht search. Het is een goed idee om te beginnen met een tabelnaam, omdat deze een duidelijk bereik voor de query definieert en zowel de queryprestaties als de relevantie van de resultaten verbetert.

Notitie

De Kusto-querytaal, die wordt gebruikt door Azure Monitor, is case-gevoelig. Taaltrefwoorden worden meestal in kleine letters geschreven. Wanneer u namen van tabellen of kolommen in een query gebruikt, moet u ervoor zorgen dat u de juiste case gebruikt, zoals wordt weergegeven in het schemadeelvenster.

Query's op basis van een tabel

Azure Monitor organiseert logboekgegevens in tabellen, die elk bestaan uit meerdere kolommen. Alle tabellen en kolommen worden weergegeven in het deelvenster met het schema in Log Analytics in de analyseportal. Identificeer een tabel waarin u geïnteresseerd bent en bekijk vervolgens een beetje gegevens:

SecurityEvent
| take 10

De voorgaande query retourneert 10 resultaten uit de tabel SecurityEvent, in geen specifieke volgorde. Dit is een veelgebruikte manier om een tabel in een oogopslag te bekijken en de structuur en inhoud ervan te begrijpen. Laten we eens kijken hoe deze is opgebouwd:

  • De query begint met de tabelnaam SecurityEvent, waarmee het bereik van de query wordt bepaald.
  • De pipe (|) teken scheidt opdrachten, zodat de uitvoer van de eerste opdracht is de invoer van de volgende. U kunt elk gewenst aantal sluistekens toevoegen.
  • Na het sluisteken volgt de take-opdracht, waarmee een specifiek aantal willekeurige records uit de tabel wordt geretourneerd.

We kunnen de query zelfs uitvoeren zonder toe te | take 10 voegen. De opdracht is nog steeds geldig, maar kan maximaal 10.000 resultaten retourneren.

Zoekquery 's

Zoekquery's zijn minder gestructureerd en zijn over het algemeen beter geschikt voor het vinden van records die een specifieke waarde in een van hun kolommen bevatten:

search in (SecurityEvent) "Cryptographic"
| take 10

Met deze query zoekt u in de tabel SecurityEvent naar records die de woordgroep 'Cryptographic' bevatten. Van deze records worden 10 records geretourneerd en weergegeven. Als u het onderdeel weglaten en alleen uitvoeren, worden alle tabellen doorzocht. Dit duurt in (SecurityEvent) langer en is minder search "Cryptographic" efficiënt.

Belangrijk

Zoekquery's zijn doorgaans langzamer dan query's op basis van een tabel, omdat ze meer gegevens moeten verwerken.

Sorteren en bovenaan

Hoewel take handig is voor het verkrijgen van een paar records, worden de resultaten geselecteerd en weergegeven in een bepaalde volgorde. Als u een geordende weergave wilt krijgen, kunt u sorteren op de gewenste kolom:

SecurityEvent   
| sort by TimeGenerated desc

De voorgaande query kan echter te veel resultaten retourneren en kan ook enige tijd duren. Met de query wordt de hele tabel SecurityEvent gesorteerd op de kolom TimeGenerated. De analytics-portal beperkt de weergave vervolgens tot slechts 10.000 records. Deze benadering is natuurlijk niet optimaal.

De beste manier om alleen de 10 meest recente records op te halen, is door top te gebruiken, waarmee de gehele tabel aan de serverzijde wordt gesorteerd en de bovenste records worden geretourneerd:

SecurityEvent
| top 10 by TimeGenerated

Aflopend is de standaardsorteer volgorde, dus u zou meestal het argument desc weglaten. De uitvoer ziet er als volgt uit:

Schermopname van de top 10 van records, gesorteerd in aflopende volgorde.

De where-operator: filteren op een voorwaarde

Zoals hun naam al aangeeft, filteren filters de gegevens op een specifieke voorwaarde. Dit is de meest voorkomende manier om de queryresultaten te beperken tot relevante informatie.

Gebruik de where-operator, gevolgd door een of meerdere voorwaarden om een filter toe te voegen aan een query. De volgende query retourneert bijvoorbeeld alleen SecurityEvent-records waarbij Niveau gelijk is aan 8:

SecurityEvent
| where Level == 8

Wanneer u filtervoorwaarden schrijft, kunt u de volgende expressies gebruiken:

Expressie Beschrijving Voorbeeld
== Gelijkheid controleren
(hoofdlettergevoelig)
Level == 8
=~ Gelijkheid controleren
(niet hoofdlettergevoelig)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <> Ongelijkheid controleren
(beide expressies zijn identiek)
Level != 4
and, or Vereist tussen voorwaarden Level == 16 or CommandLine != ""

Als u wilt filteren op meerdere voorwaarden, kunt u een van de volgende methoden gebruiken:

Gebruik en, zoals hier wordt weergegeven:

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

Spipe meerdere where-elementen, één na de andere, zoals hier wordt weergegeven:

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

Notitie

Waarden kunnen verschillende typen hebben, dus mogelijk moet u ze casten om vergelijkingen op het juiste type uit te voeren. De kolom SecurityEvent Level is bijvoorbeeld van het type Tekenreeks, dus u moet deze casten naar een numeriek type, zoals int of long, voordat u numerieke operators kunt gebruiken, zoals hier wordt weergegeven: SecurityEvent | where toint(Level) >= 10

Een periode opgeven

De tijdverdeler gebruiken

De tijdverkender wordt weergegeven naast de knop Uitvoeren en geeft aan dat u alleen records van de afgelopen 24 uur opvraagt. Dit is de standaardperiode die op alle query's wordt toegepast. Als u alleen records van het afgelopen uur wilt opvragen, selecteert u Afgelopen uur en vervolgens moet u de query opnieuw uitvoeren.

Schermopname van de tijdverdeler en de lijst met tijdsbereikopdrachten.

Een tijdfilter toevoegen aan de query

U kunt ook uw eigen tijdsbereik definiëren door een tijdfilter toe te voegen aan de query. Het is raadzaam om het tijdfilter onmiddellijk na de naam van de tabel te plaatsen:

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

In het voorgaande tijdfilter betekent '30 minuten geleden', wat betekent dat deze query alleen records van de laatste 30 minuten retourneert (uitgedrukt als ago(30m) bijvoorbeeld 30 m). Andere tijdseenheden zijn dagen (bijvoorbeeld 2d) en seconden (bijvoorbeeld 10 seconden).

Project gebruiken en uitbreiden om kolommen te selecteren en te berekenen

Gebruik project om specifieke kolommen te selecteren die in de resultaten moeten worden meegenomen:

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

In het voorgaande voorbeeld wordt de volgende uitvoer gegenereerd:

Schermopname van de resultatenlijst van de query 'project'.

U kunt project ook gebruiken om de namen van kolommen te wijzigen en nieuwe te definiëren. In het volgende voorbeeld wordt project gebruikt om het volgende te doen:

  • Alleen de oorspronkelijke kolommen Computer en TimeGenerated selecteren.
  • Geef de kolom Activiteit weer als EventDetails.
  • Een nieuwe kolom maken met de naam EventCode. De functie subtekenreeks() wordt gebruikt om alleen de eerste vier tekens uit het veld Activiteit op te halen.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

U kunt extend gebruiken om alle oorspronkelijke kolommen in de resultatenset te behouden en aanvullende kolommen te definiëren. De volgende query maakt gebruik van extend om de kolom EventCode toe te voegen. Deze kolom wordt mogelijk niet weergegeven aan het einde van de tabelresultaten. In dat geval moet u de details van een record uitbreiden om deze weer te geven.

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

Samenvatten gebruiken om groepen rijen samen te voegen

Gebruik samenvatten om groepen records te identificeren op basis van een of meer kolommen en aggregaties op deze records toe te passen. Het meest voorkomende gebruik van summarize is count, waarmee het aantal resultaten in elke groep wordt geretourneerd.

Met de volgende query worden alle Perf-records van het afgelopen uur gecontroleerd en gegroepeerd op ObjectName. Daarna worden de records in elke groep geteld:

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

Soms is het zinvol om groepen te definiëren op basis van meerdere dimensies. Elke unieke combinatie van deze waarden definieert een afzonderlijke groep:

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

Een ander algemeen gebruik is het uitvoeren van wiskundige of statistische berekeningen op elke groep. In het volgende voorbeeld wordt de gemiddelde TellerWaarde voor elke computer berekend:

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

Helaas hebben de resultaten van deze query geen betekenis, omdat we verschillende prestatiemeters hebben gecombineerd. Als u de resultaten zinvoller wilt maken, berekent u het gemiddelde afzonderlijk voor elke combinatie van CounterName en Computer:

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

Samenvatten op een tijdkolom

Het groeperen van resultaten kan ook worden gebaseerd op een tijdkolom of een andere doorlopende waarde. Door eenvoudigweg samen te by TimeGenerated vatten, maakt u echter groepen voor elke milliseconde gedurende het tijdsbereik, omdat dit unieke waarden zijn.

Als u groepen wilt maken die zijn gebaseerd op continue waarden, is het het beste om het bereik op te delen in beheerbare eenheden met behulp van bin. Met de volgende query worden Perf-records geanalyseerd die het beschikbare geheugen (Available MBytes) op een specifieke computer meten. Het berekent de gemiddelde waarde van elke periode van 1 uur gedurende de afgelopen 7 dagen:

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

Om de uitvoer duidelijker te maken, kunt u selecteren om deze weer te geven als een tijddiagram, waarin het beschikbare geheugen in de tijd wordt weergegeven:

Schermopname met de waarden van een querygeheugen in de tijd.

Volgende stappen