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 uitvoeren. Gebruik voor andere scenario's onze demo-omgeving, die tal van voorbeeldgegevens bevat.

Als u al weet hoe u query's kunt uitvoeren in Kusto-querytaal (KQL), maar snel nuttige query's moet maken op basis van resourcetypen, raadpleegt u het deelvenster opgeslagen voorbeeldquery's in Query's gebruiken in Azure Monitor Log Analytics.

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

  • Inzicht in de querystructuur.
  • 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 groeperen.

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's in Azure Monitor.

Hier volgt een videoversie van deze zelfstudie:

Vereiste machtigingen

U moet bijvoorbeeld machtigingen hebben Microsoft.OperationalInsights/workspaces/query/*/read voor de Log Analytics-werkruimten die u opvraagt, zoals opgegeven door de ingebouwde rol log analytics-lezer.

Een nieuwe query schrijven

Query's kunnen beginnen met een tabelnaam of de search opdracht. Het is een goed idee om te beginnen met een tabelnaam, omdat hiermee een duidelijk bereik voor de query wordt gedefinieerd. Het verbetert ook de queryprestaties en de relevantie van de resultaten.

Notitie

KQL, dat wordt gebruikt door Azure Monitor, is hoofdlettergevoelig. Taaltrefwoorden worden meestal geschreven in kleine letters. Wanneer u namen van tabellen of kolommen in een query gebruikt, moet u het juiste hoofdlettergebruik gebruiken, zoals wordt weergegeven in het schemavenster.

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 SecurityEvent tabel, in geen specifieke volgorde. Op deze gebruikelijke manier kunt u een overzicht krijgen van een tabel om inzicht te krijgen in de structuur en inhoud ervan. Laten we eens kijken hoe deze is opgebouwd:

  • De query begint met de tabelnaam SecurityEvent, waarmee het bereik van de query wordt gedefinieerd.

  • Het sluisteken (|) scheidt opdrachten, dus de uitvoer van de eerste opdracht is de invoer van de volgende. U kunt elk gewenst aantal sluistekens toevoegen.

  • Na de pijp is de take operator.

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

Take

Gebruik de take operator om een klein voorbeeld van records weer te geven door terug te keren naar het opgegeven aantal records. De geselecteerde resultaten zijn willekeurig en worden in geen bepaalde volgorde weergegeven. Als u resultaten in een bepaalde volgorde wilt retourneren, gebruikt u de sort en top operators.

Zoekquery 's

Zoekquery's zijn minder gestructureerd. Ze zijn beter geschikt voor het zoeken naar records die een specifieke waarde in een van hun kolommen bevatten:

search in (SecurityEvent) "Cryptographic"
| take 10

Met deze query wordt in de SecurityEvent tabel gezocht naar records die de woordgroep 'Cryptografisch' bevatten. Van deze records worden 10 records geretourneerd en weergegeven. Als u het in (SecurityEvent) onderdeel weglaat en alleen search "Cryptographic"uitvoert, wordt de zoekopdracht over alle tabellen geleid. Het proces duurt dan langer en minder efficiënt.

Belangrijk

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

Sorteren en bovenaan

In deze sectie worden de sort operators en top de bijbehorende desc argumenten beschreven asc . Hoewel take het handig is om een aantal records op te halen, kunt u de resultaten niet in een bepaalde volgorde selecteren of sorteren. Als u een geordende weergave wilt krijgen, gebruikt sort u en top.

Desc en asc

Desc

Gebruik het desc argument om records in aflopende volgorde te sorteren. Aflopend is de standaardsorteringsvolgorde voor sort en top, zodat u het desc argument meestal weglaat.

De gegevens die door beide van de volgende query's worden geretourneerd, worden bijvoorbeeld gesorteerd op de kolom TimeGenerated, in aflopende volgorde:

  • SecurityEvent	
    | sort by TimeGenerated desc
    
  • SecurityEvent	
    | sort by TimeGenerated
    

Asc

Als u wilt sorteren in oplopende volgorde, geeft u ascop.

Sort

U kunt de sort operator gebruiken. sort sorteert de queryresultaten op de kolom die u opgeeft. sort Beperk echter niet het aantal records dat door de query wordt geretourneerd.

Met de volgende query worden bijvoorbeeld alle beschikbare records voor de SecurityEvent tabel geretourneerd. Dit is maximaal 30.000 records en sorteert deze op de kolom TimeGenerated.

SecurityEvent	
| sort by TimeGenerated

De voorgaande query kan te veel resultaten opleveren. Het kan ook enige tijd duren om de resultaten te retourneren. De query sorteert de hele SecurityEvent tabel op basis van de TimeGenerated kolom. De Analytics-portal beperkt de weergave vervolgens tot slechts 30.000 records. Deze benadering is niet optimaal. De beste manier om alleen de meest recente records op te halen, is door de top operator te gebruiken.

Boven

Gebruik de top operator om de hele tabel aan de serverzijde te sorteren en vervolgens alleen de bovenste records te retourneren.

Met de volgende query worden bijvoorbeeld de meest recente tien records geretourneerd:

SecurityEvent
| top 10 by TimeGenerated

De uitvoer ziet eruit als in dit voorbeeld.

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

De where-operator: Filteren op een voorwaarde

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

Als u een filter wilt toevoegen aan een query, gebruikt u de where operator gevolgd door een of meer voorwaarden. De volgende query retourneert bijvoorbeeld alleen SecurityEvent records waarbij Level equals _8:

SecurityEvent
| where Level == 8

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

Expression 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 and, zoals hier wordt weergegeven:

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

Sluis meerdere where elementen door, éé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 uit te voeren op het juiste type. De kolom is bijvoorbeeld van het type Tekenreeks, dus u moet deze SecurityEvent Level casten naar een numeriek type, zoals int of long, voordat u er numerieke operatoren op kunt gebruiken, zoals hier wordt weergegeven: SecurityEvent | where toint(Level) >= 10

Een periode opgeven

U kunt een tijdsbereik opgeven met behulp van de tijdkiezer of een tijdfilter.

De tijdkiezer gebruiken

De tijdkiezer wordt weergegeven naast de knop Uitvoeren en geeft aan dat u alleen de afgelopen 24 uur query's uitvoert op records. Dit standaardtijdbereik wordt toegepast op alle query's. Als u alleen records van het afgelopen uur wilt ophalen, selecteert u Afgelopen uur en voert u de query opnieuw uit.

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

Een tijdfilter toevoegen aan de query

U kunt ook uw eigen tijdsbereik definiëren door een tijdfilter toe te voegen aan de query. Als u een tijdfilter toevoegt, wordt het geselecteerde tijdsbereik in de tijdkiezer overschreven.

U kunt het tijdfilter het beste direct achter de tabelnaam plaatsen:

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

In het voorgaande tijdfilter ago(30m) betekent dit '30 minuten geleden'. Deze query retourneert alleen records uit de afgelopen 30 minuten, uitgedrukt als bijvoorbeeld 30 min. Andere tijdseenheden zijn dagen (bijvoorbeeld 2d) en seconden (bijvoorbeeld 10s).

Project gebruiken en uitbreiden om kolommen te selecteren en te berekenen

Gebruik project dit om specifieke kolommen te selecteren die u wilt opnemen in de resultaten:

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

In het voorgaande voorbeeld wordt de volgende uitvoer gegenereerd:

Screenshot that shows the query 'project' results list.

U kunt ook de project naam van kolommen wijzigen en nieuwe kolommen definiëren. In het volgende voorbeeld wordt het volgende gebruikt project :

  • Selecteer alleen de Computer en TimeGenerated oorspronkelijke kolommen.
  • Activity De kolom weergeven als EventDetails.
  • Maak een nieuwe kolom met de naam EventCode. De substring() functie wordt gebruikt om alleen de eerste vier tekens uit het Activity veld op te halen.
SecurityEvent
| top 10 by TimeGenerated 
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)

U kunt extend alle oorspronkelijke kolommen in de resultatenset behouden en andere kolommen definiëren. De volgende query gebruikt extend om de EventCode kolom toe te voegen. Deze kolom wordt mogelijk niet weergegeven aan het einde van de tabelresultaten. U moet de details van een record uitvouwen 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 summarize dit om groepen records te identificeren op basis van een of meer kolommen en aggregaties toe te passen. Het meest voorkomende gebruik van summarize is count, waarmee het aantal resultaten in elke groep wordt geretourneerd.

De volgende query controleert alle Perf records van het afgelopen uur, groepeert ze op ObjectNameen telt de records in elke groep:

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 het gemiddelde CounterValue voor elke computer berekend:

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

Helaas zijn de resultaten van deze query betekenisloos omdat we verschillende prestatiemeteritems combineren. 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

Groepeerresultaten kunnen ook worden gebaseerd op een tijdkolom of een andere continue waarde. Samenvattend by TimeGeneratedzou echter groepen worden gemaakt voor elke milliseconde gedurende het tijdsbereik, omdat deze waarden uniek zijn.

Als u groepen wilt maken op basis van doorlopende waarden, kunt u het bereik het beste opsplitsen in beheerbare eenheden met behulp van bin. Met de volgende query worden records geanalyseerd Perf die het vrije geheugen (Available MBytes) op een specifieke computer meten. Hiermee wordt de gemiddelde waarde van elke periode van 1 uur berekend gedurende de afgelopen 7 dagen:

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

Als u de uitvoer duidelijker wilt maken, kunt u ervoor kiezen om deze weer te geven als een tijddiagram, waarin het beschikbare geheugen in de loop van de tijd wordt weergegeven.

Screenshot that shows the values of a query memory over time.

Veelgestelde vragen

In deze sectie vindt u antwoorden op veelgestelde vragen.

Waarom zie ik duplicaat records in Azure Monitor-logboeken?

Soms ziet u dubbele records in Azure Monitor-logboeken. Deze duplicatie is doorgaans afkomstig van een van de volgende twee voorwaarden:

  • Onderdelen in de pijplijn hebben nieuwe pogingen om een betrouwbare levering op de bestemming te garanderen. Af en toe kan deze mogelijkheid leiden tot duplicaten voor een klein percentage telemetrie-items.
  • Als de dubbele records afkomstig zijn van een virtuele machine, hebt u mogelijk zowel de Log Analytics-agent als de Azure Monitor-agent geïnstalleerd. Als u de Log Analytics-agent nog steeds nodig hebt, configureert u de Log Analytics-werkruimte om niet langer gegevens te verzamelen die ook worden verzameld door de regel voor gegevensverzameling die door de Azure Monitor-agent wordt gebruikt.

Volgende stappen