Parsa textdata i Azure Monitor-loggar

Vissa loggdata som samlas in av Azure Monitor innehåller flera informationsdelar i en enda egenskap. Om du parsar dessa data i flera egenskaper blir det enklare att använda i frågor. Ett vanligt exempel är en anpassad logg som samlar in en hel loggpost med flera värden i en enda egenskap. Genom att skapa separata egenskaper för de olika värdena kan du söka och aggregera på var och en.

Den här artikeln beskriver olika alternativ för att parsa loggdata i Azure Monitor när data matas in och när de hämtas i en fråga och jämför de relativa fördelarna för var och en.

Behörigheter som krävs

Parsningsmetoder

Du kan parsa data antingen vid inmatning när data samlas in eller vid frågetillfället när du analyserar data med en fråga. Varje strategi har unika fördelar.

Parsa data vid insamlingstidpunkter

Använd transformeringar för att parsa data vid insamlingstillfället och definiera vilka kolumner som de parsade data ska skickas till.

Fördelar:

  • Enklare att köra frågor mot insamlade data eftersom du inte behöver inkludera parsningskommandon i frågan.
  • Bättre frågeprestanda eftersom frågan inte behöver utföra parsning.

Nackdelar:

  • Måste definieras i förväg. Det går inte att inkludera data som redan har samlats in.
  • Om du ändrar parsningslogik gäller den bara för nya data.
  • Ökar svarstiden för insamling av data.
  • Fel kan vara svåra att hantera.

Parsa data vid frågetid

När du parsar data vid frågetillfället inkluderar du logik i frågan för att parsa data i flera fält. Själva tabellen ändras inte.

Fördelar:

  • Gäller för alla data, inklusive data som redan har samlats in.
  • Ändringar i logiken kan tillämpas omedelbart på alla data.
  • Flexibla parsningsalternativ, inklusive fördefinierad logik för vissa datastrukturer.

Nackdelar:

  • Kräver mer komplexa frågor. Den här nackdelen kan minimeras med hjälp av funktioner för att simulera en tabell.
  • Måste replikera parsningslogik i flera frågor. Kan dela viss logik via funktioner.
  • Kan skapa omkostnader när du kör komplex logik mot mycket stora postuppsättningar (miljarder poster).

Parsa data när de samlas in

Mer information om hur du parsar data när de samlas in finns i Struktur för transformering i Azure Monitor. Den här metoden skapar anpassade egenskaper i tabellen som kan användas av frågor som andra egenskaper.

Parsa data i en fråga med hjälp av mönster

När de data som du vill parsa kan identifieras med ett mönster som upprepas mellan poster kan du använda olika operatorer i Kusto-frågespråk för att extrahera den specifika datamängden till en eller flera nya egenskaper.

Enkla textmönster

Använd parsningsoperatorn i frågan för att skapa en eller flera anpassade egenskaper som kan extraheras från ett stränguttryck. Du anger det mönster som ska identifieras och namnen på de egenskaper som ska skapas. Den här metoden är användbar för data med nyckelvärdessträngar med ett formulär som liknar key=value.

Överväg en anpassad logg med data i följande format:

Time=2018-03-10 01:34:36 Event Code=207 Status=Success Message=Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
Time=2018-03-10 01:33:33 Event Code=208 Status=Warning Message=Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
Time=2018-03-10 01:35:44 Event Code=209 Status=Success Message=Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
Time=2018-03-10 01:38:22 Event Code=302 Status=Error Message=Application could not connect to database
Time=2018-03-10 01:31:34 Event Code=303 Status=Error Message=Application lost connection to database

Följande fråga skulle parsa dessa data i enskilda egenskaper. Raden med project läggs till för att endast returnera de beräknade egenskaperna och inte RawData, vilket är den enda egenskapen som innehåller hela posten från den anpassade loggen.

MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message

Det här exemplet delar upp användarnamnet för ett UPN i AzureActivity tabellen.

AzureActivity
| parse  Caller with UPNUserPart "@" * 
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller

Reguljära uttryck

Om dina data kan identifieras med ett reguljärt uttryck kan du använda funktioner som använder reguljära uttryck för att extrahera enskilda värden. I följande exempel används extrahering för att bryta ut fältet UPN från AzureActivity poster och sedan returnera distinkta användare.

AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller) 
| distinct UPNUserPart, Caller

För att möjliggöra effektiv parsning i stor skala använder Azure Monitor re2-versionen av reguljära uttryck, som liknar men inte är identisk med några av de andra varianterna av reguljära uttryck. Mer information finns i syntaxen för re2-uttryck.

Parsa avgränsade data i en fråga

Avgränsade data separerar fält med ett vanligt tecken, till exempel ett kommatecken i en CSV-fil. Använd funktionen split för att parsa avgränsade data med hjälp av en avgränsare som du anger. Du kan använda den här metoden med extend-operatorn för att returnera alla fält i data eller för att ange enskilda fält som ska ingå i utdata.

Anteckning

Eftersom delning returnerar ett dynamiskt objekt kan resultatet behöva omvandlas uttryckligen till datatyper, till exempel sträng som ska användas i operatorer och filter.

Överväg en anpassad logg med data i följande CSV-format:

2018-03-10 01:34:36, 207,Success,Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
2018-03-10 01:33:33, 208,Warning,Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
2018-03-10 01:35:44, 209,Success,Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
2018-03-10 01:38:22, 302,Error,Application could not connect to database
2018-03-10 01:31:34, 303,Error,Application lost connection to database

Följande fråga parsar dessa data och sammanfattar med två av de beräknade egenskaperna. Den första raden delar upp RawData egenskapen i en strängmatris. Var och en av nästa rader ger ett namn till enskilda egenskaper och lägger till dem i utdata med hjälp av funktioner för att konvertera dem till lämplig datatyp.

MyCustomCSVLog_CL
| extend CSVFields  = split(RawData, ',')
| extend EventTime  = todatetime(CSVFields[0])
| extend Code       = toint(CSVFields[1]) 
| extend Status     = tostring(CSVFields[2]) 
| extend Message    = tostring(CSVFields[3]) 
| where getyear(EventTime) == 2018
| summarize count() by Status,Code

Parsa fördefinierade strukturer i en fråga

Om dina data är formaterade i en känd struktur kan du kanske använda en av funktionerna i Kusto-frågespråk för att parsa fördefinierade strukturer:

Följande exempelfråga parsar fältet Properties i AzureActivity tabellen, som är strukturerat i JSON. Resultatet sparas i en dynamisk egenskap med namnet parsedProp, som innehåller det enskilda namngivna värdet i JSON. Dessa värden används för att filtrera och sammanfatta frågeresultaten.

AzureActivity
| extend parsedProp = parse_json(Properties) 
| where parsedProp.isComplianceCheck == "True" 
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)

Dessa parsningsfunktioner kan vara processorintensiva. Använd dem bara när frågan använder flera egenskaper från formaterade data. Annars går det snabbare med enkel mönstermatchning.

I följande exempel visas uppdelningen av domänkontrollanttypen TGT Preauth . Typen finns bara i fältet EventData , vilket är en XML-sträng. Inga andra data från det här fältet behövs. I det här fallet används parsning för att välja ut den data som krävs.

SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' * 
| summarize count() by PreAuthType

Använda en funktion för att simulera en tabell

Du kan ha flera frågor som utför samma parsning av en viss tabell. I det här fallet skapar du en funktion som returnerar parsade data i stället för att replikera parsningslogiken i varje fråga. Du kan sedan använda funktionsaliaset i stället för den ursprungliga tabellen i andra frågor.

Överväg föregående kommaavgränsade anpassade loggexempel. Om du vill använda parsade data i flera frågor skapar du en funktion med hjälp av följande fråga och sparar den med aliaset MyCustomCSVLog.

MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend DateTime  = tostring(CSVFields[0])
| extend Code      = toint(CSVFields[1]) 
| extend Status    = tostring(CSVFields[2]) 
| extend Message   = tostring(CSVFields[3]) 

Du kan nu använda aliaset MyCustomCSVLog i stället för det faktiska tabellnamnet i frågor som i följande exempel:

MyCustomCSVLog
| summarize count() by Status,Code

Nästa steg

Lär dig mer om loggfrågor för att analysera data som samlas in från datakällor och lösningar.