開始使用 Azure 監視器中的查詢
注意
如果您要從至少一部虛擬機器收集資料,則可以在自己的環境中進行這項練習。 針對其他案例,請使用我們的示範環境,其中包括許多範例資料。
如果您已經知道如何在 Kusto 查詢語言 (KQL) 中查詢,但需要根據資源類型來快速建立有用的查詢,則請參閱在 Azure 監視器 Log Analytics 中使用查詢中的已儲存範例查詢窗格。
在本教學課程中,您將了解如何在 Azure 監視器中撰寫記錄查詢。 本文將說明如何:
- 了解查詢結構。
- 排序查詢結果。
- 篩選查詢結果。
- 指定時間範圍。
- 選取要包括在結果中的欄位。
- 定義和使用自訂欄位。
- 彙總和群組結果。
如需如何在 Azure 入口網站中使用 Log Analytics 的教學課程,請參閱開始使用 Azure 監視器 Log Analytics。
如需 Azure 監視器中記錄查詢的詳細資訊,請參閱 Azure 監視器中的記錄查詢概觀。
以下是本教學課程的影片版本:
需要的權限
例如,對於查詢的 Log Analytics 工作區,您必須擁有 Microsoft.OperationalInsights/workspaces/query/*/read
權限,如 Log Analytics 讀取器內建角色所提供。
撰寫新的查詢
查詢可以透過資料表名稱或 search
命令來開始。 從資料表名稱開始是一個好方向,因為這會定義清楚的查詢範圍。 這也會改善查詢效能和結果的相關性。
注意
Azure 監視器所使用的 KQL 會區分大小寫。 語言關鍵字通常會以小寫來撰寫。 當您在查詢中使用資料表或資料行的名稱時,請務必使用正確的大小寫,如結構描述窗格所示。
以資料表為基礎的查詢
Azure 監視器會將記錄資料整理成皆由數個資料行所組成的資料表。 所有資料表和資料行都會顯示在 Analytics 入口網站中 Log Analytics 中的 [結構描述] 窗格。 請找出您感興趣的資料表,然後看看其中的資料:
SecurityEvent
| take 10
先前的查詢會傳回 SecurityEvent
資料表中的 10 個結果 (沒有特定順序)。 這是一覽資料表並協助您了解其結構和內容的常見方式。 讓我們檢查其建置方式:
此查詢會從資料表名稱
SecurityEvent
開始,以定義查詢的範圍。垂直線 (|) 字元會分隔命令,因此第一個命令的輸出就是下一個命令的輸入。 您可以新增任意數目的垂直線元素。
接在管道之後是
take
運算子。即使未新增
| take 10
,我們還是可以實際執行查詢。 此命令仍然有效,但最多可以傳回 30,000 個結果。
Take
使用 take
運算子最多可傳回指定的記錄數目,用以檢視記錄的小型樣本。 系統會任意選取結果,並且不會以任何特定順序顯示。 如果您需要以特定順序傳回結果,請使用 sort
和 top
運算子。
搜尋查詢
搜尋查詢的結構較為鬆散。 通常較適合用於尋找其任何資料行中包括特定值的記錄:
search in (SecurityEvent) "Cryptographic"
| take 10
此查詢會搜尋 SecurityEvent
資料表,看看其中是否有記錄包含「Cryptographic」片語。系統會傳回並顯示這些記錄的其中 10 筆。 如果您省略 in (SecurityEvent)
部分並只執行 search "Cryptographic"
,則搜尋會對所有資料表執行。 此流程固然就會需要更長時間,並且效率較低。
重要
搜尋查詢的速度一般會比資料表式的查詢慢,因為所需處理的資料更多。
Sort 和 top
本節說明 sort
和 top
運算子及其 desc
和 asc
引數。 雖然 take
對於取得一些記錄很有用,但您無法以任何特定順序選取或排序結果。 若要取得已排序的檢視,請使用 sort
和 top
。
Desc 和 asc
Desc
使用 desc
引數以依遞減順序排序記錄。 遞減是 sort
和 top
的預設排序順序,因此您通常可以省略 desc
引數。
例如,下列兩個查詢所傳回的資料會依遞減順序排序 TimeGenerated 資料行:
-
SecurityEvent | sort by TimeGenerated desc
-
SecurityEvent | sort by TimeGenerated
Asc
若要依遞增順序排序,請指定 asc
。
Sort
您可以使用 sort
運算子。 sort
會依您指定的資料行排序查詢結果。 然而,sort
不會限制查詢傳回的記錄數目。
例如,下列查詢會傳回 SecurityEvent
資料表的所有可用記錄,最多 30,000 筆記錄並且會依 TimeGenerated 資料行排序。
SecurityEvent
| sort by TimeGenerated
上述查詢可能會傳回太多結果。 此外,也可能需要一些時間才會傳回結果。 查詢會依 TimeGenerated
資料行排序整個 SecurityEvent
資料表。 Analytics 入口網站接著會限制為只顯示 30,000 筆記錄。 這不是最佳方法。 取得最新記錄的最佳方式是使用 top
運算子。
前幾個
使用 top
運算子 來排序伺服器端的整個資料表,然後只傳回最上層的記錄。
例如,下列查詢會傳回最新 10 筆資料列:
SecurityEvent
| top 10 by TimeGenerated
輸出看起來會像這個範例。
where 運算子:根據條件進行篩選
顧名思義,篩選會根據特定條件來篩選資料。 篩選條件最常用來限制查詢結果,以便只顯示相關資訊。
若要對查詢新增篩選條件,請使用 where
運算子,後面加上一個或多個條件。 例如,下列查詢僅會傳回 Level equals _8
的 SecurityEvent
資料列:
SecurityEvent
| where Level == 8
撰寫篩選條件時,您可以使用下列運算式:
運算式 | 描述 | 範例 |
---|---|---|
== | 檢查是否相等 (區分大小寫) |
Level == 8 |
=~ | 檢查是否相等 (不區分大小寫) |
EventSourceName =~ "microsoft-windows-security-auditing" |
!=, <> | 檢查是否不相等 (這兩個運算式同義) |
Level != 4 |
and , or |
條件之間必要 | Level == 16 or CommandLine != "" |
若要依多個條件進行篩選,您可以使用下列其中一種方式:
使用 and
,如下所示:
SecurityEvent
| where Level == 8 and EventID == 4672
透過垂直線將多個 where
元素一個接一個地串連在一起,如下所示:
SecurityEvent
| where Level == 8
| where EventID == 4672
注意
值可以有不同類型,因此,您可能需要轉換值才能對正確類型進行比較。 例如,SecurityEvent Level
資料行是字串類型,因此,您必須先將其轉換為數值類型 (例如,int
或 long
),才能對其使用數值運算子,如這裡所示:SecurityEvent | where toint(Level) >= 10
指定時間範圍
您可以使用時間選擇器或時間篩選條件來指定時間範圍。
使用時間選擇器
時間選擇器會顯示在 [執行] 按鈕旁邊,並指出您只查詢過去 24 小時的記錄。 此預設時間範圍會套用至所有查詢。 若只要取得過去 1 小時的記錄,請選取 [過去 1 小時],然後再次執行查詢。
將時間篩選新增至查詢
您也可以對查詢新增時間篩選,藉以定義您自己的時間範圍。 新增時間篩選條件會覆寫時間選擇器中選取的時間範圍。
放置時間篩選條件的最佳位置在資料表名稱之後:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
在上述時間篩選條件中,ago(30m)
表示「30 分鐘前」。此查詢只會傳回過去 30 分鐘的記錄,表示方式將會如此例所示:30m。 其他時間單位包括天 (例如,2d) 和秒 (例如,10 秒)。
使用 project 和 extend 來選取和計算資料行
使用 project
可選取要包含在結果中的特定資料行:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
上述範例會產生下列輸出:
您也可以使用 project
將資料行重新命名並定義新的資料行。 下一個範例會使用 project
來執行下列動作:
- 只選取
Computer
和TimeGenerated
原始資料行。 - 將
Activity
資料行顯示為EventDetails
。 - 建立名為
EventCode
的新資料行。substring()
函式可用於僅取得Activity
欄位中的前四個字元。
SecurityEvent
| top 10 by TimeGenerated
| project Computer, TimeGenerated, EventDetails=Activity, EventCode=substring(Activity, 0, 4)
您可以使用 extend
來保留結果集中的所有原始資料行,並定義其他資料行。 下列查詢會使用 extend
來新增 EventCode
資料行。 此資料行可能不會顯示在資料表結果的結尾。 您必須展開記錄的詳細資料,才能檢視記錄。
SecurityEvent
| top 10 by TimeGenerated
| extend EventCode=substring(Activity, 0, 4)
使用 summarize 來彙總資料列群組
使用 summarize
以根據一或多個資料行來識別記錄群組,並對其套用彙總。 summarize
最常見的用法是 count
,其會傳回每個群組中的結果數目。
下列查詢會檢閱過去 1 小時的所有 Perf
記錄、依 ObjectName
將這些記錄分組,並計算每個群組中的記錄數目:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName
依多個維度來定義群組有時很合理。 這些值的每個唯一組合可定義出不同的群組:
Perf
| where TimeGenerated > ago(1h)
| summarize count() by ObjectName, CounterName
另一個常見用途是針對每個群組進行數學或統計計算。 下列範例會計算每部電腦的 CounterValue
平均值:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer
很遺憾,此查詢的結果並無意義,原因是我們混搭使用不同的效能計數器。 若要讓結果更有意義,請針對每個 CounterName
與 Computer
組合分別計算平均值:
Perf
| where TimeGenerated > ago(1h)
| summarize avg(CounterValue) by Computer, CounterName
依時間資料行彙總
群組結果也可以根據時間資料行或其他連續值來進行。 不過,只彙總 by TimeGenerated
會針對時間範圍內的每個單一毫秒建立群組,因為這些都是唯一值。
若要根據連續值建立群組,最佳方式是使用 bin
將範圍分成可管理的單位。 下列查詢會分析 Perf
記錄,這些記錄會測量特定電腦上的可用記憶體 (Available MBytes
)。 這會計算過去 7 天每 1 小時期間的平均值:
Perf
| where TimeGenerated > ago(7d)
| where Computer == "ContosoAzADDS2"
| where CounterName == "Available MBytes"
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)
若要讓輸出更加清楚,您可以選擇將其顯示為時間圖表,以顯示一段時間的可用記憶體。
常見問題集
本節提供常見問題的答案。
為什麼我會在 Azure 監視器記錄中看到重複記錄?
有時候,您可能會注意到 Azure 監視器記錄中有重複記錄。 此重複通常是因為下列兩種情況之一:
- 管線中的元件已重試,以確保在目的地可靠傳遞。 有時候此功能可能會導致一小部分的遙測項目重複。
- 如果重複記錄來自虛擬機器,則您可能已安裝 Log Analytics 代理程式和 Azure 監視器代理程式。 如果仍需安裝 Log Analytics 代理程式,請將 Log Analytics 工作區設定為不再收集 Azure 監視器代理程式使用的資料收集規則所收集的資料。
下一步
- 若要深入了解如何在記錄查詢中使用字串資料,請參閱在 Azure 監視器記錄查詢中使用字串。
- 若要深入了解如何在記錄查詢中彙總資料,請參閱 Azure 監視器記錄查詢中的進階彙總。
- 若要了解如何從多個資料表聯結資料,請參閱 Azure 監視器記錄查詢中的聯結。
- 在 KQL 語言參考中取得整個 Kusto 查詢語言的相關文件。