Tekstgegevens parseren in Azure Monitor-logboeken
Sommige logboekgegevens die door Azure Monitor worden verzameld, bevatten meerdere stukjes informatie in één eigenschap. Het parseren van deze gegevens in meerdere eigenschappen maakt het eenvoudiger om in query's te gebruiken. Een veelvoorkomend voorbeeld is een aangepast logboek dat een volledige logboekvermelding met meerdere waarden in één eigenschap verzamelt. Door afzonderlijke eigenschappen voor de verschillende waarden te maken, kunt u op elk van deze waarden zoeken en aggregeren.
In dit artikel worden verschillende opties beschreven voor het parseren van logboekgegevens in Azure Monitor wanneer de gegevens worden opgenomen en wanneer deze worden opgehaald in een query, waarbij de relatieve voordelen voor elke query worden vergeleken.
Vereiste machtigingen
- Als u gegevens tijdens het verzamelen wilt parseren, hebt u bijvoorbeeld machtigingen nodig
Microsoft.Insights/dataCollectionRuleAssociations/*
, zoals opgegeven door de ingebouwde rol Log Analytics-inzender. - Als u gegevens tijdens query's wilt parseren, hebt u bijvoorbeeld machtigingen nodig
Microsoft.OperationalInsights/workspaces/query/*/read
, zoals opgegeven door de ingebouwde rol van Log Analytics Reader.
Methoden voor parseren
U kunt gegevens parseren tijdens opnametijd wanneer de gegevens worden verzameld of op het moment van query wanneer u de gegevens analyseert met een query. Elke strategie heeft unieke voordelen.
Gegevens parseren tijdens het verzamelen
Gebruik transformaties om gegevens tijdens het verzamelen te parseren en te definiëren naar welke kolommen de geparseerde gegevens moeten worden verzonden.
Voordelen:
- Eenvoudiger om query's uit te voeren op de verzamelde gegevens omdat u geen parseringsopdrachten in de query hoeft op te nemen.
- Betere queryprestaties omdat de query geen parsering hoeft uit te voeren.
Nadelen:
- Moet vooraf worden gedefinieerd. Kan geen gegevens bevatten die al zijn verzameld.
- Als u de parseringslogica wijzigt, is deze alleen van toepassing op nieuwe gegevens.
- Verhoogt de latentietijd voor het verzamelen van gegevens.
- Fouten kunnen lastig te verwerken zijn.
Gegevens parseren op querytijd
Wanneer u gegevens tijdens query's parseert, neemt u logica op in uw query om gegevens in meerdere velden te parseren. De werkelijke tabel zelf wordt niet gewijzigd.
Voordelen:
- Van toepassing op alle gegevens, inclusief gegevens die al zijn verzameld.
- Wijzigingen in logica kunnen onmiddellijk worden toegepast op alle gegevens.
- Flexibele parseringsopties, inclusief vooraf gedefinieerde logica voor bepaalde gegevensstructuren.
Nadelen:
- Hiervoor zijn complexere query's vereist. Dit nadeel kan worden beperkt door functies te gebruiken om een tabel te simuleren.
- Moet parseringslogica in meerdere query's repliceren. Kan bepaalde logica delen via functies.
- Kan overhead creëren wanneer u complexe logica uitvoert voor zeer grote recordsets (miljarden records).
Gegevens parseren terwijl deze worden verzameld
Zie Structuur van transformatie in Azure Monitor voor meer informatie over het parseren van gegevens die worden verzameld. Met deze methode worden aangepaste eigenschappen in de tabel gemaakt die kunnen worden gebruikt door query's zoals elke andere eigenschap.
Gegevens in een query parseren met behulp van patronen
Wanneer de gegevens die u wilt parseren, kunnen worden geïdentificeerd door een patroon dat wordt herhaald in records, kunt u verschillende operators in de Kusto-querytaal gebruiken om het specifieke stukje gegevens op te halen in een of meer nieuwe eigenschappen.
Eenvoudige tekstpatronen
Gebruik de parseringsoperator in uw query om een of meer aangepaste eigenschappen te maken die kunnen worden geëxtraheerd uit een tekenreeksexpressie. U geeft het patroon op dat moet worden geïdentificeerd en de namen van de eigenschappen die moeten worden gemaakt. Deze methode is handig voor gegevens met sleutel-waardetekenreeksen met een formulier dat vergelijkbaar is met key=value
.
Overweeg een aangepast logboek met gegevens in de volgende indeling:
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
Met de volgende query worden deze gegevens geparseerd in afzonderlijke eigenschappen. De regel met project
wordt toegevoegd om alleen de berekende eigenschappen te retourneren. RawData
Dit is de enige eigenschap die de volledige vermelding uit het aangepaste logboek bevat.
MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message
In dit voorbeeld wordt de gebruikersnaam van een UPN in de AzureActivity
tabel uitgesplitst.
AzureActivity
| parse Caller with UPNUserPart "@" *
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller
Reguliere expressies
Als uw gegevens kunnen worden geïdentificeerd met een reguliere expressie, kunt u functies gebruiken die reguliere expressies gebruiken om afzonderlijke waarden te extraheren. In het volgende voorbeeld wordt uitpakken gebruikt om het veld uit te UPN
splitsen uit AzureActivity
records en vervolgens afzonderlijke gebruikers te retourneren.
AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller)
| distinct UPNUserPart, Caller
Om efficiënt parseren op grote schaal mogelijk te maken, gebruikt Azure Monitor de re2-versie van reguliere expressies, die vergelijkbaar is, maar niet identiek is aan een aantal van de andere reguliere expressievarianten. Zie de syntaxis van de re2-expressie voor meer informatie.
Gegevens met scheidingstekens parseren in een query
Met gescheiden gegevens worden velden gescheiden met een gemeenschappelijk teken, zoals een komma in een CSV-bestand. Gebruik de splitsfunctie om gescheiden gegevens te parseren met behulp van een scheidingsteken dat u opgeeft. U kunt deze methode gebruiken met de operator uitbreiden om alle velden in de gegevens te retourneren of om afzonderlijke velden op te geven die moeten worden opgenomen in de uitvoer.
Notitie
Omdat splitsen een dynamisch object retourneert, moeten de resultaten mogelijk expliciet worden omgezet in gegevenstypen, zoals een tekenreeks die moet worden gebruikt in operators en filters.
Overweeg een aangepast logboek met gegevens in de volgende CSV-indeling:
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
Met de volgende query worden deze gegevens geparseerd en samengevat door twee van de berekende eigenschappen. Met de eerste regel wordt de RawData
eigenschap gesplitst in een tekenreeksmatrix. Elk van de volgende regels geeft een naam aan afzonderlijke eigenschappen en voegt deze toe aan de uitvoer met behulp van functies om ze te converteren naar het juiste gegevenstype.
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
Vooraf gedefinieerde structuren parseren in een query
Als uw gegevens zijn opgemaakt in een bekende structuur, kunt u mogelijk een van de functies in de Kusto-querytaal gebruiken om vooraf gedefinieerde structuren te parseren:
De volgende voorbeeldquery parseert het Properties
veld van de AzureActivity
tabel, dat is gestructureerd in JSON. De resultaten worden opgeslagen in een dynamische eigenschap met de naam parsedProp
, die de afzonderlijke benoemde waarde in de JSON bevat. Deze waarden worden gebruikt om de queryresultaten te filteren en samen te vatten.
AzureActivity
| extend parsedProp = parse_json(Properties)
| where parsedProp.isComplianceCheck == "True"
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)
Deze parseringsfuncties kunnen processorintensief zijn. Gebruik deze alleen wanneer uw query meerdere eigenschappen van de opgemaakte gegevens gebruikt. Anders is eenvoudige verwerking van patroonkoppeling sneller.
In het volgende voorbeeld ziet u de uitsplitsing van het type domeincontroller TGT Preauth
. Het type bestaat alleen in het EventData
veld, een XML-tekenreeks. Er zijn geen andere gegevens uit dit veld nodig. In dit geval wordt parseren gebruikt om het vereiste stukje gegevens te kiezen.
SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' *
| summarize count() by PreAuthType
Een functie gebruiken om een tabel te simuleren
Mogelijk hebt u meerdere query's die dezelfde parsering van een bepaalde tabel uitvoeren. In dit geval maakt u een functie die de geparseerde gegevens retourneert in plaats van de parseringslogica in elke query te repliceren. Vervolgens kunt u de functiealias gebruiken in plaats van de oorspronkelijke tabel in andere query's.
Bekijk het voorgaande voorbeeld van een door komma's gescheiden aangepast logboek. Als u de geparseerde gegevens in meerdere query's wilt gebruiken, maakt u een functie met behulp van de volgende query en slaat u deze op met de alias 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])
U kunt nu de alias MyCustomCSVLog
gebruiken in plaats van de werkelijke tabelnaam in query's, zoals in het volgende voorbeeld:
MyCustomCSVLog
| summarize count() by Status,Code
Volgende stappen
Meer informatie over logboekquery's voor het analyseren van de gegevens die zijn verzameld uit gegevensbronnen en oplossingen.