從結構化字串資料中解壓縮資料
字串欄位也可以包含 JSON 或索引鍵-值組等結構化資料。 KQL 可讓您輕鬆存取這些值,以供進一步分析。
動態欄位
在記錄分析資料表中,具有定義為動態的欄位類型。 動態欄位包含索引鍵/值組,例如:
{"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 或 JsonField["Key"] 任一種函式來參照至欄位 |
mv-expand | 套用至動態類型陣列或是屬性包資料行,讓集合中的每個數值都能得到分開的資料列。 所有其他在展開資料列中的資料行皆會被複製。 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")