从结构化字符串数据中提取数据

已完成

字符串字段还可以包含结构化数据,如 JSON 或键值对。 使用 KQL 可轻松访问这些值以进行进一步分析。

动态字段

Log Analytics 表中有定义为“动态”的字段类型。 动态字段包含键值对,如:

{"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"}

若要访问动态字段中的字符串,请使用点表示法。 SigninLogs 表中的 DeviceDetail 字段属于动态类型。 在此示例中,可使用 DeviceDetail.operatingSystem 字段名称访问操作系统。

SigninLogs 
| extend OS = DeviceDetail.operatingSystem

下面的查询示例显示了将动态字段用于 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 提供函数来处理存储在字符串字段中的 JSON。 许多日志以 JSON 格式提交数据,这要求了解如何将 JSON 数据转换为可查询字段。

以下示例是 JSON 相关函数和运算符的列表。

Function 说明
parse-json() 或 todynamic() 将字符串解释为 JSON 值并返回动态值。 使用这两个函数中的任一个来引用一个字段:JsonField.Key 或 JsonField["Key"]
mv-expand 应用于 dynamic 类型的数组或属性包,以便集合中的每个值都获得一个单独的行。 将复制扩展行中的所有其他列。 mv_expand 是处理 JSON 数组的最简单方法。
mv-apply 对每个记录应用子查询,并返回所有子查询结果的并集。 对数组中的每个值应用查询。

分别运行每个查询以查看结果。

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