剖析 Azure 監視器記錄中的文字資料
Azure 監視器所收集的部分記錄資料將在單一屬性中包含多個資訊片段。 將此資料剖析成多個屬性可讓您更輕鬆地在查詢中使用。 常見的範例為自訂記錄檔,可將具有多個值的整個記錄檔項目收集成單一屬性。 您可以針對不同的值建立不同的屬性,以便對每個屬性進行搜尋和彙總。
本文說明在擷取資料時,以及在查詢中取出資料時,剖析 Azure 監視器中記錄資料的不同選項,並比較各個選項的相對優點。
需要的權限
- 若要在收集時剖析資料,您需要
Microsoft.Insights/dataCollectionRuleAssociations/*
權限,例如 Log Analytics 參與者內建角色所提供的權限。 - 若要在查詢時剖析資料,您需要
Microsoft.OperationalInsights/workspaces/query/*/read
權限,例如 Log Analytics 讀者內建角色所提供的權限。
剖析方法
您可以在收集資料時剖析擷取期間的資料,或是在使用查詢分析資料時剖析查詢期間的資料。 每個策略都有獨特的優點。
在收集期間剖析資料
使用轉換以在收集時剖析資料,並定義剖析資料要傳送至的資料行。
優點:
- 更輕鬆地查詢所收集的資料,因為您不需要在查詢中包含剖析命令。
- 更好的查詢效能,因為查詢不需要執行剖析。
缺點:
- 必須事先加以定義。 無法包含已經收集的資料。
- 如果您變更剖析邏輯,它只會套用至新的資料。
- 增加收集資料的延遲時間。
- 錯誤可能難以處理。
在查詢期間剖析資料
當您在查詢期間剖析資料時,您會在查詢中包含邏輯,以便將資料剖析成多個欄位。 實際資料表本身未修改。
優點:
- 適用於任何資料,包括已收集的資料。
- 邏輯變更可以立即套用至所有資料。
- 剖析選項彈性,包括針對特定資料結構預先定義的邏輯。
缺點:
- 需要更複雜的查詢。 這項缺點可藉由使用模擬資料表的函式來減輕。
- 必須在多個查詢中複寫剖析邏輯。 可以透過函式共用特定邏輯。
- 針對非常大型的記錄集 (數百萬筆記錄) 執行複雜的邏輯時,可能會造成額外負荷。
剖析所收集的資料
如需剖析所收集資料的詳細資訊,請參閱 Azure 監視器的轉換結構。 此方法會在可供查詢使用的資料表中建立自訂屬性,就像其他任何屬性一樣。
使用模式來剖析查詢中的資料
當您想要剖析的資料可以透過記錄之間重複的模式識別時,您可以在 Kusto 查詢語言中使用不同的運算子,將特定資料片段擷取到一或多個新的屬性。
簡易文字模式
在查詢中使用 parse 運算子建立可以從字串運算式擷取的一或多個自訂屬性。 您可以指定要識別的模式,以及要建立之屬性的名稱。 此方法適合用於具有類似 key=value
形式之索引鍵/值字串的字串。
請考慮具有下列格式資料的自訂記錄檔:
Time=2018-03-10 01:34:36 Event Code=207 Status=Success Message=Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
Time=2018-03-10 01:33:33 Event Code=208 Status=Warning Message=Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
Time=2018-03-10 01:35:44 Event Code=209 Status=Success Message=Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
Time=2018-03-10 01:38:22 Event Code=302 Status=Error Message=Application could not connect to database
Time=2018-03-10 01:31:34 Event Code=303 Status=Error Message=Application lost connection to database
下列查詢會將此資料剖析成個別的屬性。 加入具有 project
的那一行僅會傳回計算的屬性,而非 RawData
,後者是保留自訂記錄檔中整個項目的單一屬性。
MyCustomLog_CL
| parse RawData with * "Time=" EventTime " Event Code=" Code " Status=" Status " Message=" Message
| project EventTime, Code, Status, Message
本範例會細分 AzureActivity
資料表中 UPN 的使用者名稱。
AzureActivity
| parse Caller with UPNUserPart "@" *
| where UPNUserPart != "" //Remove non UPN callers (apps, SPNs, etc)
| distinct UPNUserPart, Caller
規則運算式
如果可以使用規則運算式識別您的資料,則您可以利用使用規則運算式的函式來擷取個別的值。 下列範例使用 extract,從 AzureActivity
記錄中細分 UPN
欄位,然後再傳回不同的使用者。
AzureActivity
| extend UPNUserPart = extract("([a-z.]*)@", 1, Caller)
| distinct UPNUserPart, Caller
若要大規模啟用有效率的剖析功能,Azure 監視器會使用 re2 版的規則運算式,這類似部分其他規則運算式版本,但不完全相同。 如需詳細資訊,請參閱 re2 運算式語法。
在查詢中剖析分隔的資料
分隔的資料會以一般字元分隔欄位,像是 CSV 檔案中的逗號。 利用 split 函式來剖析使用您指定之分隔符號分隔的資料。 您可以使用這個方法搭配 extend 運算子,傳回資料中的所有欄位,或指定要包含在輸出中的個別欄位。
注意
split 會傳回動態物件,因此結果可能需要明確地轉換成字串之類的資料類型,才能用於運算子和篩選中。
請考慮具有下列 CSV 格式資料的自訂記錄檔:
2018-03-10 01:34:36, 207,Success,Client 05a26a97-272a-4bc9-8f64-269d154b0e39 connected
2018-03-10 01:33:33, 208,Warning,Client ec53d95c-1c88-41ae-8174-92104212de5d disconnected
2018-03-10 01:35:44, 209,Success,Transaction 10d65890-b003-48f8-9cfc-9c74b51189c8 succeeded
2018-03-10 01:38:22, 302,Error,Application could not connect to database
2018-03-10 01:31:34, 303,Error,Application lost connection to database
下列查詢會剖析此資料,並以其中兩個計算的屬性摘要說明。 第一行會將 RawData
屬性分割成字串陣列。 接下來幾行的每一行都會為個別的屬性提供名稱,並使用將這些屬性轉換成適當資料類型的函式,將其新增至輸出。
MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend EventTime = todatetime(CSVFields[0])
| extend Code = toint(CSVFields[1])
| extend Status = tostring(CSVFields[2])
| extend Message = tostring(CSVFields[3])
| where getyear(EventTime) == 2018
| summarize count() by Status,Code
剖析查詢中預先定義的結構
如果您的資料採用已知的結構設定格式,您可以使用 Kusto 查詢語言中的其中一種函式,剖析預先定義的結構:
下列範例查詢會剖析 AzureActivity
資料表的 Properties
欄位 (以 JSON 進行結構化)。 它會將結果儲存到稱為 parsedProp
的動態屬性,其中包括 JSON 中的個別命名值。 這些值用來篩選和彙總查詢結果。
AzureActivity
| extend parsedProp = parse_json(Properties)
| where parsedProp.isComplianceCheck == "True"
| summarize count() by ResourceGroup, tostring(parsedProp.tags.businessowner)
這些剖析函式可能需要密集使用處理器。 只有在查詢使用來自格式化資料的多個屬性時,才使用它們。 否則,簡單的模式比對處理會更快。
下列範例顯示網域控制站 TGT Preauth
類型的分解。 此類型只存在於 EventData
欄位中,這是 XML 字串。 不需要此欄位中的其他資料。 在此情況下,parse 用來挑出所需的資料片段。
SecurityEvent
| where EventID == 4768
| parse EventData with * 'PreAuthType">' PreAuthType '</Data>' *
| summarize count() by PreAuthType
使用函式來模擬資料表
您可能有多個查詢會針對特定資料表執行相同的剖析。 在此情況下,建立函式,且該函式會傳回剖析的資料,而不會複寫每個查詢中的剖析邏輯。 之後您可以使用函式別名來取代其他查詢中的原始資料表。
請考慮上述以逗號分隔的自訂記錄檔範例。 若要在多個查詢中使用已剖析的資料,請使用下列查詢建立函式,並以 MyCustomCSVLog
別名加以儲存。
MyCustomCSVLog_CL
| extend CSVFields = split(RawData, ',')
| extend DateTime = tostring(CSVFields[0])
| extend Code = toint(CSVFields[1])
| extend Status = tostring(CSVFields[2])
| extend Message = tostring(CSVFields[3])
您現在可以使用別名 MyCustomCSVLog
來取代查詢中的實際資料表名稱,如下列範例所示:
MyCustomCSVLog
| summarize count() by Status,Code
下一步
了解記錄查詢,以分析從資料來源和解決方案收集到的資料。