Estrarre dati da dati stringa strutturati
I campi stringa possono anche contenere dati strutturati, ad esempio coppie chiave-valore o JSON. KQL consente di accedere facilmente a questi valori per un'analisi ulteriore.
Campi dinamici
All'interno di una tabella Log Analytics sono presenti tipi di campo definiti come dinamici. I campi dinamici contengono una coppia chiave-valore, ad esempio:
{"eventCategory":"Autoscale","eventName":"GetOperationStatusResult","operationId":"xxxxxxxx-6a53-4aed-bab4-575642a10226","eventProperties":"{\"OldInstancesCount\":6,\"NewInstancesCount\":5}","eventDataId":" xxxxxxxx -efe3-43c2-8c86-cd84f70039d3","eventSubmissionTimestamp":"2020-11-30T04:06:17.0503722Z","resource":"ch-appfevmss-pri","resourceGroup":"CH-RETAILRG-PRI","resourceProviderValue":"MICROSOFT.COMPUTE","subscriptionId":" xxxxxxxx -7fde-4caf-8629-41dc15e3b352","activityStatusValue":"Succeeded"}
Per accedere alle stringhe all'interno di un campo dinamico, usare la notazione del punto. Il campo DeviceDetail della tabella SigninLogs è di tipo dinamico. In questo esempio è possibile accedere al sistema operativo con il nome del campo DeviceDetail.operatingSystem.
SigninLogs
| extend OS = DeviceDetail.operatingSystem
L'esempio di query seguente mostra l'uso dei campi dinamici con la tabella SigninLogs.
// Example query for SigninLogs showing how to break out packed fields.
SigninLogs
| extend OS = DeviceDetail.operatingSystem, Browser = DeviceDetail.browser
| extend StatusCode = tostring(Status.errorCode), StatusDetails = tostring(Status.additionalDetails)
| extend Date = startofday(TimeGenerated)
| summarize count() by Date, Identity, UserDisplayName, UserPrincipalName, IPAddress, ResultType, ResultDescription, StatusCode, StatusDetails
| sort by Date
JSON
KQL fornisce funzioni per la modifica di JSON archiviati nei campi stringa. Molti log inviano i dati in formato JSON, è quindi necessario saper modificare i dati JSON in campi queryable.
L'esempio seguente riporta un elenco di funzioni e operatori correlati a JSON.
Funzione | Descrizione |
---|---|
parse-json() o todynamic() | interpreta una stringa come un valore JSON e restituisce il valore come dinamico. Usare una di queste funzioni per fare riferimento a un campo: JsonField.Key o JsonField["Key"] |
mv-expand | viene applicato a una matrice o a una colonna contenitore di proprietà tipizzata dinamica in modo che ogni valore dell'insieme ottenga una riga separata. Tutte le altre colonne in una riga espansa vengono duplicate. mv_expand è il modo più semplice per elaborare matrici JSON. |
mv-apply | applica una sottoquery a ogni record e restituisce l'unione dei risultati di tutte le sottoquery. Applicare una query a ciascun valore di una matrice. |
Eseguire ogni query separatamente per visualizzare i risultati.
SigninLogs
| extend AuthDetails = parse_json(AuthenticationDetails)
| extend AuthMethod = AuthDetails[0].authenticationMethod
| extend AuthResult = AuthDetails[0].["authenticationStepResultDetail"]
| project AuthMethod, AuthResult, AuthDetails
SigninLogs
| mv-expand AuthDetails = parse_json(AuthenticationDetails)
| project AuthDetails
SigninLogs
| mv-apply AuthDetails = parse_json(AuthenticationDetails) on
(where AuthDetails.authenticationMethod == "Password")