開始使用 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 運算子最多可傳回指定的記錄數目,用以檢視記錄的小型樣本。 系統會任意選取結果,並且不會以任何特定順序顯示。 如果您需要以特定順序傳回結果,請使用 sorttop 運算子

搜尋查詢

搜尋查詢的結構較為鬆散。 通常較適合用於尋找其任何資料行中包括特定值的記錄:

search in (SecurityEvent) "Cryptographic"
| take 10

此查詢會搜尋 SecurityEvent 資料表,看看其中是否有記錄包含「Cryptographic」片語。系統會傳回並顯示這些記錄的其中 10 筆。 如果您省略 in (SecurityEvent) 部分並只執行 search "Cryptographic",則搜尋會對所有資料表執行。 此流程固然就會需要更長時間,並且效率較低。

重要

搜尋查詢的速度一般會比資料表式的查詢慢,因為所需處理的資料更多。

Sort 和 top

本節說明 sorttop 運算子及其 descasc 引數。 雖然 take 對於取得一些記錄很有用,但您無法以任何特定順序選取或排序結果。 若要取得已排序的檢視,請使用 sorttop

Desc 和 asc

Desc

使用 desc 引數以依遞減順序排序記錄。 遞減是 sorttop 的預設排序順序,因此您通常可以省略 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

輸出看起來會像這個範例。

Screenshot that shows the top 10 records sorted in descending order.

where 運算子:根據條件進行篩選

顧名思義,篩選會根據特定條件來篩選資料。 篩選條件最常用來限制查詢結果,以便只顯示相關資訊。

若要對查詢新增篩選條件,請使用 where 運算子,後面加上一個或多個條件。 例如,下列查詢僅會傳回 Level equals _8SecurityEvent 資料列:

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 資料行是字串類型,因此,您必須先將其轉換為數值類型 (例如,intlong),才能對其使用數值運算子,如這裡所示:SecurityEvent | where toint(Level) >= 10

指定時間範圍

您可以使用時間選擇器或時間篩選條件來指定時間範圍。

使用時間選擇器

時間選擇器會顯示在 [執行] 按鈕旁邊,並指出您只查詢過去 24 小時的記錄。 此預設時間範圍會套用至所有查詢。 若只要取得過去 1 小時的記錄,請選取 [過去 1 小時],然後再次執行查詢。

Screenshot that shows the time picker and its list of time-range commands.

將時間篩選新增至查詢

您也可以對查詢新增時間篩選,藉以定義您自己的時間範圍。 新增時間篩選條件會覆寫時間選擇器中選取的時間範圍。

放置時間篩選條件的最佳位置在資料表名稱之後:

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

上述範例會產生下列輸出:

Screenshot that shows the query 'project' results list.

您也可以使用 project 將資料行重新命名並定義新的資料行。 下一個範例會使用 project 來執行下列動作:

  • 只選取 ComputerTimeGenerated 原始資料行。
  • 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

很遺憾,此查詢的結果並無意義,原因是我們混搭使用不同的效能計數器。 若要讓結果更有意義,請針對每個 CounterNameComputer 組合分別計算平均值:

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)

若要讓輸出更加清楚,您可以選擇將其顯示為時間圖表,以顯示一段時間的可用記憶體。

Screenshot that shows the values of a query memory over time.

常見問題集

本節提供常見問題的答案。

為什麼我會在 Azure 監視器記錄中看到重複記錄?

有時候,您可能會注意到 Azure 監視器記錄中有重複記錄。 此重複通常是因為下列兩種情況之一:

  • 管線中的元件已重試,以確保在目的地可靠傳遞。 有時候此功能可能會導致一小部分的遙測項目重複。
  • 如果重複記錄來自虛擬機器,則您可能已安裝 Log Analytics 代理程式和 Azure 監視器代理程式。 如果仍需安裝 Log Analytics 代理程式,請將 Log Analytics 工作區設定為不再收集 Azure 監視器代理程式使用的資料收集規則所收集的資料。

下一步