Aan de slag met logboekquery's in Azure Monitor-logboeken
In dit artikel worden de basisprincipes uitgelegd van het schrijven van logboekquery's in Azure Monitor-logboeken, waaronder het volgende:
- Structureer een query.
- Queryresultaten sorteren.
- Queryresultaten filteren.
- Geef een tijdsbereik op.
- Kolommen opnemen of uitsluiten in queryresultaten.
- Aangepaste velden definiëren en gebruiken.
- Resultaten aggregeren en groeperen.
Waar van toepassing biedt het artikel voorbeelden van het uitvoeren van query's op gegevens met behulp van zowel Kusto-querytaal (KQL) als de eenvoudige Log Analytics-modus.
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.
Zelfstudievideo
Notitie
In deze video ziet u een eerdere versie van de gebruikersinterface, maar de schermafbeeldingen in dit artikel zijn up-to-date en weerspiegelen de huidige gebruikersinterface.
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 query structuren
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 schemadeelvenster in Log Analytics in Azure Portal.
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.
Zoekquery 's
Zoekquery's zijn minder gestructureerd. Ze zijn het meest geschikt voor het zoeken naar records die een specifieke waarde bevatten in een van de kolommen van een bepaalde tabel.
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:
search in (SecurityEvent) "Cryptographic"
| take 10
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.
Resultaten beperken
Gebruik de take
operator om een klein voorbeeld van records weer te geven door terug te keren naar het opgegeven aantal records. Voorbeeld:
SecurityEvent
| take 10
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.
Resultaten sorteren
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
.
Sort
U kunt de sort
operator gebruiken om de queryresultaten te sorteren 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.
Desc en asc
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
Als u wilt sorteren in oplopende volgorde, geeft u asc
op.
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:
Resultaten filteren
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 != "" |
Filteren op meerdere voorwaarden
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.
Notitie
Als u een tijdsbereik in de query opneemt, wordt de tijdkiezer automatisch gewijzigd in Instellen in de query. Als u de tijdkiezer handmatig wijzigt in een andere waarde, past Log Analytics het kleinere van de twee tijdsbereiken toe.
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.
Een tijdfilter toevoegen aan de query
U kunt ook uw eigen tijdsbereik definiëren door een tijdfilter toe te voegen aan de query.
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).
Kolommen opnemen of uitsluiten in queryresultaten
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:
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
enTimeGenerated
oorspronkelijke kolommen. -
Activity
De kolom weergeven alsEventDetails
. - Maak een nieuwe kolom met de naam
EventCode
. Desubstring()
functie wordt gebruikt om alleen de eerste vier tekens uit hetActivity
veld op te halen.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Aangepaste velden definiëren en gebruiken
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)
Notitie
Gebruik de extend
operator voor ad-hocberekeningen in query's. Gebruik opnametijdtransformaties of samenvattingsregels om gegevens tijdens opnametijd te transformeren of aggregeren voor efficiëntere query's.
Resultaten samenvoegen en groeperen
Groepen rijen aggregeren
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 ObjectName
en telt de records in elke groep:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
Unieke combinaties van waarden in meerdere kolommen groeperen
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
Wiskundige of statistische berekeningen uitvoeren
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 TimeGenerated
zou 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 == "DC01.na.contosohotels.com"
| 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. Hiervoor gaat u naar de grafiekweergave , opent u de zijbalk grafiekopmaak rechts en selecteert u Lijn voor grafiektype:
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
- Zie Werken met tekenreeksquery's in Azure Monitor-logboekquery's voor meer informatie over het gebruik van tekenreeksgegevens in een logboekquery.
- Zie Geavanceerde aggregaties in Azure Monitor-logboekquery's voor meer informatie over het samenvoegen van gegevens in een logboekquery.
- Zie Joins in Azure Monitor-logboekquery's voor meer informatie over het samenvoegen van gegevens uit meerdere tabellen.
- Download documentatie over de volledige Kusto-querytaal in de KQL-taalverwijzing.