共用方式為


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

本文說明在 Azure 監視器記錄中寫入記錄查詢的基本概念,包括如何:

如果適用,本文提供使用 Kusto 查詢語言 (KQL) 和 Log Analytics 簡單模式查詢數據的範例。

注意

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

教學課程影片

注意

這段影片顯示舊版的使用者介面,但本文中的螢幕快照是最新的,並反映目前的UI。


需要的權限

例如,您必須擁有所查詢 Log Analytics 工作區的 Microsoft.OperationalInsights/workspaces/query/*/read 權限,這是由 Log Analytics 讀者內建角色所提供。

建構查詢

查詢可以透過資料表名稱或 search 命令來開始。 從資料表名稱開始是一個好方向,因為這會定義清楚的查詢範圍。 這也會改善查詢效能和結果的相關性。

注意

Azure 監視器所使用的 KQL 會區分大小寫。 語言關鍵字通常會以小寫來撰寫。 當您在查詢中使用資料表或資料行的名稱時,請務必使用正確的大小寫,如結構描述窗格所示。

以資料表為基礎的查詢

Azure 監視器會將記錄資料整理成皆由數個資料行所組成的資料表。 所有數據表和數據行都會顯示在log Analytics 的架構窗格中,Azure 入口網站。

識別您感興趣的數據表,然後查看一些數據:

SecurityEvent
| take 10

先前的查詢會傳回 SecurityEvent 資料表中的 10 個結果 (沒有特定順序)。 這是一覽資料表並協助您了解其結構和內容的常見方式。 讓我們檢查其建置方式:

  • 此查詢會從資料表名稱 SecurityEvent 開始,以定義查詢的範圍。
  • 垂直線 (|) 字元會分隔命令,因此第一個命令的輸出就是下一個命令的輸入。 您可以新增任意數目的垂直線元素。
  • 在管道後面是 take 運算符。 即使未新增 | take 10,我們還是可以實際執行查詢。 此命令仍然有效,但最多可以傳回 30,000 個結果。

搜尋查詢

搜尋查詢的結構較為鬆散。 它們最適合尋找在特定數據表的任何數據行中包含特定值的記錄。

此查詢會搜尋數據表中 SecurityEvent 含有「密碼編譯」片語的記錄。在這些記錄中,會傳回並顯示10筆記錄:

search in (SecurityEvent) "Cryptographic"
| take 10

如果您省略 in (SecurityEvent) 部分並只執行 search "Cryptographic",則搜尋會對所有資料表執行。 此流程固然就會需要更長時間,並且效率較低。

重要

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

限制結果

take使用 運算符可傳回最多指定的記錄數目,以檢視記錄的小型樣本。 例如:

SecurityEvent
| take 10

系統會任意選取結果,並且不會以任何特定順序顯示。 如果您需要以特定順序傳回結果,請使用 sorttop 運算符。

排序結果

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

Sort

您可以使用 sort 運算子 ,依您指定的數據行來排序查詢結果。 然而,sort 不會限制查詢傳回的記錄數目。

例如,下列查詢會傳回 SecurityEvent 資料表的所有可用記錄,最多 30,000 筆記錄並且會依 TimeGenerated 資料行排序。

SecurityEvent	
| sort by TimeGenerated

上述查詢可能會傳回太多結果。 此外,也可能需要一些時間才會傳回結果。 查詢會依 TimeGenerated 資料行排序整個 SecurityEvent 資料表。 Analytics 入口網站接著會限制為只顯示 30,000 筆記錄。 這不是最佳方法。 取得最新記錄的最佳方式是使用 top 運算子

Desc 和 asc

使用 desc 引數以依遞減順序排序記錄。 遞減是 sorttop 的預設排序順序,因此您通常可以省略 desc 引數。

例如,下列兩個查詢所傳回的資料會依遞減順序排序 TimeGenerated 資料行

  • SecurityEvent	
    | sort by TimeGenerated desc
    
  • SecurityEvent	
    | sort by TimeGenerated
    

若要依遞增順序排序,請指定 asc

前幾個

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

例如,下列查詢會傳回最新 10 筆資料列:

SecurityEvent
| top 10 by TimeGenerated

輸出看起來會類似此範例:

此螢幕擷取畫面顯示依遞減順序排序的前 10 筆記錄。

篩選結果

篩選條件最常用來限制查詢結果,以便只顯示相關資訊。

若要對查詢新增篩選條件,請使用 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


指定時間範圍

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

注意

如果您在查詢中包含時間範圍,時間選擇器會自動變更為 [在查詢中設定]。 如果您手動將時間選擇器變更為不同的值,Log Analytics 會套用兩個時間範圍的較小值。

使用時間選擇器

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

顯示 KQL 模式中時間選擇器及其時間範圍命令清單的螢幕快照。

將時間篩選新增至查詢

您也可以對查詢新增時間篩選,藉以定義您自己的時間範圍。

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

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

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

顯示查詢「專案」結果清單的螢幕擷取畫面。

您也可以使用 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)

注意

extend 查詢中使用運算符進行臨機作計算。 使用 擷取時間轉換摘要規則 ,在擷取時間轉換或匯總數據,以取得更有效率的查詢。

匯總和群組結果

匯總數據列群組

使用 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 == "DC01.na.contosohotels.com" 
| where CounterName == "Available MBytes" 
| summarize avg(CounterValue) by bin(TimeGenerated, 1h)

若要讓輸出更加清楚,您可以選擇將其顯示為時間圖表,以顯示一段時間的可用記憶體。 若要這樣做,請切換至 [圖表] 檢視,開啟右側的 [圖表格式] 提要欄,然後選取 [圖表類型] 的 [折線]:

此螢幕快照顯示 KQL 模式中一段時間的查詢記憶體值。

常見問題集

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

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

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

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

下一步