Extrair dados de cadeia de caracteres estruturada

Concluído

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")