開始使用 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
系統會任意選取結果,並且不會以任何特定順序顯示。 如果您需要以特定順序傳回結果,請使用 sort
和 top
運算符。
排序結果
本節說明 sort
和 top
運算子及其 desc
和 asc
引數。 雖然 take
對於取得一些記錄很有用,但您無法以任何特定順序選取或排序結果。 若要取得已排序的檢視,請使用 sort
和 top
。
Sort
您可以使用 sort
運算子 ,依您指定的數據行來排序查詢結果。 然而,sort
不會限制查詢傳回的記錄數目。
例如,下列查詢會傳回 SecurityEvent
資料表的所有可用記錄,最多 30,000 筆記錄並且會依 TimeGenerated 資料行排序。
SecurityEvent
| sort by TimeGenerated
上述查詢可能會傳回太多結果。 此外,也可能需要一些時間才會傳回結果。 查詢會依 TimeGenerated
資料行排序整個 SecurityEvent
資料表。 Analytics 入口網站接著會限制為只顯示 30,000 筆記錄。 這不是最佳方法。 取得最新記錄的最佳方式是使用 top
運算子。
Desc 和 asc
使用 desc
引數以依遞減順序排序記錄。 遞減是 sort
和 top
的預設排序順序,因此您通常可以省略 desc
引數。
例如,下列兩個查詢所傳回的資料會依遞減順序排序 TimeGenerated 資料行:
-
SecurityEvent | sort by TimeGenerated desc
-
SecurityEvent | sort by TimeGenerated
若要依遞增順序排序,請指定 asc
。
前幾個
使用 top
運算子 來排序伺服器端的整個資料表,然後只傳回最上層的記錄。
例如,下列查詢會傳回最新 10 筆資料列:
SecurityEvent
| top 10 by TimeGenerated
輸出看起來會類似此範例:
篩選結果
篩選條件最常用來限制查詢結果,以便只顯示相關資訊。
若要對查詢新增篩選條件,請使用 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
指定時間範圍
您可以使用時間選擇器或時間篩選條件來指定時間範圍。
注意
如果您在查詢中包含時間範圍,時間選擇器會自動變更為 [在查詢中設定]。 如果您手動將時間選擇器變更為不同的值,Log Analytics 會套用兩個時間範圍的較小值。
使用時間選擇器
時間選擇器會顯示在 [執行] 按鈕旁邊,並指出您只查詢過去 24 小時的記錄。 此預設時間範圍會套用至所有查詢。 若只要取得過去 1 小時的記錄,請選取 [過去 1 小時],然後再次執行查詢。
將時間篩選新增至查詢
您也可以對查詢新增時間篩選,藉以定義您自己的時間範圍。
放置時間篩選條件的最佳位置在資料表名稱之後:
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
來執行下列動作:
- 只選取
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
最常見的用法是 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 == "DC01.na.contosohotels.com"
| 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 查詢語言的相關文件。