開始使用 Azure 監視器中的查詢

注意

如果您要從至少一部虛擬機器收集資料,您可以在自己的環境中完成此練習。 針對其他案例,請使用我們的 示範環境 ,其中包含許多範例資料。

如果您已經知道如何在 Kusto 查詢語言 (KQL) 中查詢,但需要根據資源類型快速建立有用的查詢,請參閱在 Azure 監視器 Log Analytics 中使用查詢中的 已儲存範例查詢窗格。

在本教學課程中,您會瞭解如何在 Azure 監視器中撰寫記錄查詢。 本文說明如何:

  • 瞭解查詢結構。
  • 排序查詢結果。
  • 篩選查詢結果。
  • 指定時間範圍。
  • 選取要包含在結果中的欄位。
  • 定義和使用自訂欄位。
  • 匯總和群組結果。

如需在Azure 入口網站中使用 Log Analytics 的教學課程,請參閱 開始使用 Azure 監視器 Log Analytics

如需 Azure 監視器中記錄查詢的詳細資訊,請參閱 Azure 監視器 中的記錄查詢概觀。

以下是本教學課程的影片版本:

需要的權限

例如,您必須具有 Microsoft.OperationalInsights/workspaces/query/*/read 您查詢的 Log Analytics 工作區許可權,例如 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 含有「密碼編譯」片語的記錄。在這些記錄中,會傳回並顯示 10 筆記錄。 如果您省略元件 in (SecurityEvent) 並只 search "Cryptographic" 執行 ,則搜尋會超過 所有 資料表。 然後,此程式需要更長的時間,且效率較低。

重要

搜尋查詢通常比以資料表為基礎的查詢慢,因為它們必須處理更多資料。

排序和頂端

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

Desc 和 asc

Desc

使用 自 desc 變數以遞減順序排序記錄。 遞減是 和 top 的預設排序次序 sort ,因此您通常可以省略 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 資料表。 分析入口網站接著會將顯示限制為只有 30,000 筆記錄。 這種方法不是最佳方法。 只取得最新記錄的最佳方式是使用 top 運算子

前幾個

top 使用 運算子 來排序伺服器端的整個資料表,然後只傳回頂端記錄。

例如,下列查詢會傳回最新的 10 筆記錄:

SecurityEvent
| top 10 by TimeGenerated

輸出看起來像這個範例。

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

where 運算子:篩選準則

篩選,如其名稱所指示,依特定條件篩選資料。 篩選是將查詢結果限制為相關資訊的最常見方式。

若要將篩選新增至查詢,請使用 where 運算子 ,後面接著一或多個條件。 例如,下列查詢只會 SecurityEvent 傳回記錄,其中 Level equals _8

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 行的類型為 String,因此您必須將它轉換成數數值型別,例如 intlong ,才能在上面使用數值運算子,如下所示: SecurityEvent | where toint(Level) >= 10

指定時間範圍

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

使用時間選擇器

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

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 來選取要包含在結果中的特定資料行:

SecurityEvent 
| top 10 by TimeGenerated 
| project TimeGenerated, Computer, Activity

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

Screenshot that shows the query 'project' results list.

您也可以使用 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 來根據一或多個資料行識別記錄群組,並將匯總套用至它們。 最常見的用法 summarizecount ,它會傳回每個群組中的結果數目。

下列查詢會檢閱過去一小時內的所有 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

不幸的是,此查詢的結果毫無意義,因為我們將不同的效能計數器混合在一起。 若要讓結果更具意義,請針對 和 Computer 的每個組合 CounterName 分別計算平均值:

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 監視器代理程式所使用的資料收集規則所收集的資料。

下一步