从结构化字符串数据中提取数据
字符串字段还可以包含结构化数据,如 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")