Kom igång med loggfrågor i Azure Monitor
Anteckning
Om du samlar in data från minst en virtuell dator kan du gå igenom den här övningen i din egen miljö. För andra scenarier använder du vår demomiljö, som innehåller massor av exempeldata.
Om du redan vet hur du frågar i Kusto-frågespråket, men snabbt behöver skapa användbara frågor baserat på resurstyper, kan du läsa fönstret med sparade exempelfrågor i artikeln Använda frågor i Azure Monitor Log Analytics.
I den här självstudien lär du dig att skriva loggfrågor i Azure Monitor. Artikeln visar hur du:
- Förstå frågestrukturen.
- Sortera frågeresultat.
- Filtrera frågeresultat.
- Ange ett tidsperiod.
- Välj vilka fält som ska ingå i resultatet.
- Definiera och använda anpassade fält.
- Aggregera och gruppera resultat.
En självstudiekurs om hur du använder Log Analytics i Azure Portal finns i Kom igång med Azure Monitor Log Analytics.
Mer information om loggfrågor i Azure Monitor finns i Översikt över loggfrågor i Azure Monitor.
Här är en videoversion av den här självstudien:
Skriva en ny fråga
Frågor kan börja med antingen ett tabellnamn eller med sökkommandot. Det är en bra idé att börja med ett tabellnamn, eftersom det definierar ett tydligt omfång för frågan och förbättrar både frågeprestanda och resultatets relevans.
Anteckning
Kusto-frågespråket, som används av Azure Monitor, är fallkänsligt. Språknyckelord skrivs vanligtvis med gemener. När du använder namn på tabeller eller kolumner i en fråga måste du använda rätt fall, som du ser i schemafönstret.
Tabellbaserade frågor
Azure Monitor organiserar loggdata i form av tabeller som var och en består av flera kolumner. Alla tabeller och kolumner visas i schemafönstret i Log Analytics i Analytics-portalen. Identifiera en tabell som du är intresserad av och ta sedan en titt på lite data:
SecurityEvent
| take 10
Föregående fråga returnerar 10 resultat från tabellen SecurityEvent, utan någon specifik ordning. Det här är ett vanligt sätt att ta en titt på en tabell och förstå dess struktur och innehåll. Nu ska vi titta närmare på hur den är uppbyggd:
- Frågan börjar med tabellnamnet SecurityEvent, som definierar frågans omfång.
- Pipe-tecknet (|) separerar kommandon, så utdata från det första kommandot är indata för nästa. Du kan lägga till val annat antal piped-element.
- Efter pipe är kommandot take, som returnerar ett visst antal godtyckliga poster från tabellen.
Vi skulle faktiskt kunna köra frågan även utan att lägga till | take 10 . Kommandot skulle fortfarande vara giltigt, men det kan returnera upp till 10 000 resultat.
Sökfrågor
Sökfrågor är mindre strukturerade och passar vanligtvis bättre för att hitta poster som innehåller ett visst värde i någon av kolumnerna:
search in (SecurityEvent) "Cryptographic"
| take 10
Den här frågan söker i tabellen SecurityEvent efter poster som innehåller frasen "Kryptografisk". Av dessa poster returneras och visas 10 poster. Om du utelämnar delen och bara kör går sökningen igenom alla tabeller, vilket skulle ta in (SecurityEvent) längre tid och vara mindre search "Cryptographic" effektivt.
Viktigt
Sökfrågor är vanligtvis långsammare än tabellbaserade frågor eftersom de måste bearbeta mer data.
Sortera och upp
Även om take är användbart för att hämta några poster, väljs resultaten och visas i ingen viss ordning. Om du vill få en ordnad vy kan du sortera efter önskad kolumn:
SecurityEvent
| sort by TimeGenerated desc
Föregående fråga kan dock returnera för många resultat, och det kan också ta lite tid. Frågan sorterar hela Tabellen SecurityEvent efter kolumnen TimeGenerated. Analytics-portalen begränsar sedan visningen till endast 10 000 poster. Den här metoden är förstås inte optimal.
Det bästa sättet att bara hämta de senaste 10 posterna är att använda top , som sorterar hela tabellen på serversidan och sedan returnerar de översta posterna:
SecurityEvent
| top 10 by TimeGenerated
Fallande är standardsorteringsordningen, så du utelämnar vanligtvis desc-argumentet. Utdata ser ut så här:

Operatorn where: filtrering på ett villkor
Filter, som anges med deras namn, filtrerar data efter ett specifikt villkor. Det här är det vanligaste sättet att begränsa frågeresultat till relevant information.
Om du vill lägga till ett filter i en fråga använder du operatorn where följt av ett eller flera villkor. Till exempel returnerar följande fråga endast SecurityEvent-poster där Level är lika med 8:
SecurityEvent
| where Level == 8
När du skriver filtervillkor kan du använda följande uttryck:
| Uttryck | Beskrivning | Exempel |
|---|---|---|
| == | Kontrollera likhet (case-sensitive) |
Level == 8 |
| =~ | Kontrollera likhet (icke-känsligt) |
EventSourceName =~ "microsoft-windows-security-auditing" |
| !=, <> | Kontrollera olikhet (båda uttrycken är identiska) |
Level != 4 |
| and, or | Krävs mellan villkor | Level == 16 or CommandLine != "" |
Om du vill filtrera efter flera villkor kan du använda någon av följande metoder:
Använd och, som du ser här:
SecurityEvent
| where Level == 8 and EventID == 4672
Skicka flera where-element, ett efter det andra, enligt följande:
SecurityEvent
| where Level == 8
| where EventID == 4672
Anteckning
Värden kan ha olika typer, så du kan behöva typge dem för att göra jämförelser på rätt typ. Kolumnen SecurityEvent Level är till exempel av typen String, så du måste typge den till en numerisk typ, till exempel int eller long, innan du kan använda numeriska operatorer på den, som du ser här: SecurityEvent | where toint(Level) >= 10
Ange ett tidsintervall
Använda tidsväljaren
Tidsväljaren visas bredvid knappen Kör och anger att du bara kör frågor mot poster från de senaste 24 timmarna. Det här är standardtidsintervallet som tillämpas på alla frågor. Om du bara vill hämta poster från den senaste timmen väljer du Senaste timmen och kör sedan frågan igen.

Lägga till ett tidsfilter i frågan
Du kan också definiera ett eget tidsintervall genom att lägga till ett tidsfilter i frågan. Det är bäst att placera tidsfiltret direkt efter tabellnamnet:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
I föregående tidsfilter innebär det "30 minuter sedan", vilket innebär att den här frågan returnerar poster från endast de senaste 30 minuterna (uttryckt som till exempel ago(30m) 30 m). Andra tidsenheter är dagar (till exempel 2d) och sekunder (till exempel 10 sekunder).
Använda projekt och utöka för att välja och beräkna kolumner
Använd projekt för att välja specifika kolumner som ska ingå i resultatet:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
Föregående exempel genererar följande utdata:

Du kan också använda projektet för att byta namn på kolumner och definiera nya. I nästa exempel används projektet för att göra följande:
- Välj endast kolumnerna Computer och TimeGenerated original.
- Visa kolumnen Aktivitet som EventDetails.
- Skapa en ny kolumn med namnet EventCode. Funktionen substring() används för att endast hämta de första fyra tecknen från fältet Aktivitet.
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
Du kan använda extend för att behålla alla ursprungliga kolumner i resultatuppsättningen och definiera ytterligare kolumner. Följande fråga använder extend för att lägga till kolumnen EventCode. Den här kolumnen kanske inte visas i slutet av tabellresultaten. I så fall behöver du expandera informationen för en post för att visa den.
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
Använd summarize för att aggregera grupper med rader
Använd summarize för att identifiera grupper av poster enligt en eller flera kolumner och tillämpa sammansättningar på dem. Den vanligaste användningen av summarize är count, som returnerar antalet resultat i varje grupp.
Följande fråga granskar alla Perf-poster från den senaste timmen, grupperar dem efter ObjectName och räknar posterna i varje grupp:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
Ibland är det klokt att definiera grupper efter flera dimensioner. Varje unik kombination av dessa värden definierar en separat grupp:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
Ett annat vanligt användningsbruk är att utföra matematiska eller statistiska beräkningar på varje grupp. I följande exempel beräknas det genomsnittliga CounterValue för varje dator:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
Tyvärr är resultatet av den här frågan meningslöst eftersom vi blandade ihop en mängd olika prestandaräknare. Om du vill göra resultatet mer meningsfullt beräknar du medelvärdet separat för varje kombination av CounterName och Computer:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
Sammanfatta efter en tidskolumn
Grupperingsresultat kan också baseras på en tidskolumn eller ett annat kontinuerligt värde. Att bara sammanfatta skulle dock skapa grupper för varje by TimeGenerated millisekund över tidsperioden, eftersom dessa är unika värden.
Om du vill skapa grupper som baseras på kontinuerliga värden är det bäst att dela upp intervallet i hanterbara enheter med hjälp av lagerplatsen. Följande fråga analyserar prestandaposter som mäter ledigt minne (tillgängliga MB) på en specifik dator. Det beräknar det genomsnittliga värdet för varje 1-timmesperiod under de senaste 7 dagarna:
Perf
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
För att göra utdata tydligare kan du välja att visa det som ett tidsdiagram som visar tillgängligt minne över tid:

Nästa steg
- Mer information om hur du använder strängdata i en loggfråga finns i Arbeta med strängar i Azure Monitor för loggfrågor.
- Mer information om att aggregera data i en loggfråga finns i Avancerade aggregeringar i Azure Monitor loggfrågor.
- Information om hur du ansluter data från flera tabeller finns i Kopplingar i Azure Monitor och loggfrågor.
- Hämta dokumentation om hela Kusto-frågespråket i KQL-språkreferensen.