Extraire des données à partir de données de chaîne structurées
Les champs de chaînes peuvent également contenir des données structurées telles que JSON ou des paires Key-Value. KQL fournit un accès facile à ces valeurs pour une analyse plus approfondie.
Champs dynamiques
Dans une table Log Analytics, il existe des types de champs définis comme dynamiques. Les champs dynamiques contiennent une paire clé-valeur telle que :
{"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"}
Pour accéder aux chaînes dans un champ dynamique, utilisez la notation par points. Le champ DeviceDetail de la table SigninLogs est de type dynamique. Dans cet exemple, vous pouvez accéder au système d’exploitation avec le nom du champ DeviceDetail.operatingSystem.
SigninLogs
| extend OS = DeviceDetail.operatingSystem
L’exemple de requête ci-dessous montre l’utilisation de champs dynamiques avec la table 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 fournit des fonctions pour manipuler JSON stocké dans des champs de chaîne. De nombreux journaux de logs envoient des données au format JSON, ce qui requiert de savoir comment transformer des données JSON en champs interrogeables.
L’exemple ci-dessous est une liste des fonctions et opérateurs liés au json.
Fonction | Description |
---|---|
parse-json() ou todynamic() | Interprète une chaîne en tant que valeur JSON et retourne la valeur comme dynamique. Utilisez l’une de ces fonctions pour faire référence à un champ : JsonField.Key ou JsonField["Key"] |
mv-expand | L’opérateur est appliqué à un tableau ou à une colonne de jeu de propriétés de type dynamique afin que chaque valeur de la collection obtienne une ligne distincte. Toutes les autres colonnes d’une ligne développée sont dupliquées. mv_expand est le moyen le plus simple de traiter des tableaux JSON. |
mv-apply | Applique une sous-requête à chaque enregistrement et retourne l’union des résultats de toutes les sous-requêtes. Appliquez une requête à chaque valeur d’un tableau. |
Exécutez chaque requête séparément pour afficher les résultats.
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")