Extrair dados de cadeia de caracteres estruturada
Os campos de cadeia de caracteres também contêm dados estruturados, como dados JSON ou pares chave-valor. O KQL fornece acesso fácil a esses valores para análise posterior.
Campos dinâmicos
Em uma tabela de Análise de Logs, há tipos de campo definidos como Dinâmicos. Os campos dinâmicos contêm um par chave-valor, como:
{"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"}
Para acessar as cadeias de caracteres em um campo dinâmico, use a notação de ponto. O campo DeviceDetail da tabela SigninLogs é do tipo dinâmico. Neste exemplo, você pode acessar o Sistema Operacional com o nome de campo DeviceDetail.operatingSystem.
SigninLogs
| extend OS = DeviceDetail.operatingSystem
A consulta de exemplo abaixo mostra o uso de campos dinâmicos com a tabela 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
O KQL fornece funções para a manipulação do JSON armazenado em campos de cadeia de caracteres. Muitos logs enviam dados no formato JSON, o que demanda saber como transformar dados JSON em campos consultáveis.
O exemplo abaixo mostra uma lista de funções e operações relacionadas a JSON.
Função | Descrição |
---|---|
parse-json() ou todynamic() | Interpreta uma cadeia de caracteres como um valor JSON e retorna o valor como dinâmico. Use uma dessas funções para se referir a um campo: JsonField.Key ou JsonField["Key"] |
mv-expand | é aplicado em uma coluna de recipiente de propriedades ou matriz de tipo dinâmico para que cada valor na coleção tenha uma linha separada. Todas as outras colunas em uma linha expandida são duplicadas. mv_expand é a maneira mais fácil de processar matrizes JSON. |
mv-apply | Aplica uma subconsulta a cada registro e retorna a união dos resultados de todas as subconsultas. Aplique uma consulta a cada valor de uma matriz. |
Execute cada consulta separadamente para ver os resultados.
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")