培训
模块
引导式项目 - 使用 KQL 分析 Azure Monitor 中的日志 - Training
编写日志查询,深入了解你的业务、IT 运营和性能。 使用 Kusto 查询语言 (KQL) 提取 Azure Monitor Log Analytics 中的日志数据。
备注
如果要从至少一个虚拟机收集数据,你可以在自己的环境中完成此练习。 对于其他应用场景,请使用演示环境,它包含大量示例数据。
如果已知道如何使用 Kusto 查询语言 (KQL) 进行查询,但需要快速创建基于资源类型的有用查询,请参阅在 Azure Monitor Log Analytics 中使用查询中的保存的示例查询窗格。
本教程介绍如何在 Azure Monitor 中编写日志查询。 本文介绍以下操作:
有关在 Azure 门户中使用 Log Analytics 的教程,请参阅 Azure Monitor Log Analytics 入门。
有关 Azure Monitor 中日志查询的详细信息,请参阅 Azure Monitor 中的日志查询概述。
下面是本教程的视频版本:
你必须对查询的 Log Analytics 工作区具有 Microsoft.OperationalInsights/workspaces/query/*/read
权限,例如,Log Analytics 读者内置角色所提供的权限。
查询可以从表名或 search
命令开始。 从表名开始是一个好主意,因为它定义了明确的查询范围。 它还提高了查询性能和结果的相关性。
备注
Azure Monitor 使用的 KQL 区分大小写。 语言关键字通常采用小写形式。 在查询中使用表名或列名时,请确保使用正确的大小写,如架构窗格中所示。
Azure Monitor 在表中组织日志数据,每个表由多个列组成。 所有表和列都显示在 Analytics 门户中的 Log Analytics 中的架构窗格内。 找到所需的表,然后看看其中的一些数据:
SecurityEvent
| take 10
上面的查询从 SecurityEvent
表返回 10 个结果(无特定顺序)。 这是浏览表的常用方法,有助于你了解其结构和内容。 让我们探讨表的生成方式:
查询从表名 SecurityEvent
开始,表名定义了查询范围。
管道字符 (|) 用来分隔命令,第一个命令的输出是下一个命令的输入。 可以添加任意数目的管道元素。
管道之后是 take
运算符。
即使不添加 | take 10
,也可运行查询。 该命令仍然有效,但最多可以返回 30,000 个结果。
使用 take
运算符通过返回最多为指定数量的记录来查看记录的小样本。 所选结果是任意的,并且不按特定顺序显示。 如果需要按特定顺序返回结果,请使用 sort
和 top
运算符。
搜索查询的结构较简单。 它们通常更适合用于查找在任何列中包含特定值的记录:
search in (SecurityEvent) "Cryptographic"
| take 10
此查询会在 SecurityEvent
表中搜索包含“Cryptographic”一词的记录。在这些记录中,将返回并显示 10 条记录。 如果省略 in (SecurityEvent)
部分且仅运行 search "Cryptographic"
,那么搜索将查找所有表。 此过程则会花费更长时间,而且效率更低。
重要
搜索查询通常比基于表的查询更慢,因为它们必须处理更多的数据。
本部分介绍了 sort
和 top
运算符及其参数 desc
和 asc
。 虽然 take
可用于获取一些记录,但不能按任何特定顺序选择或对结果进行排序。 要获取排序的视图,请使用 sort
和 top
。
使用 desc
参数按降序对记录进行排序。 降序是用于 sort
和 top
的默认排序顺序,因此通常可以省略 desc
参数。
例如,以下两个查询返回的数据按 TimeGenerated 列按降序排序:
SecurityEvent
| sort by TimeGenerated desc
SecurityEvent
| sort by TimeGenerated
若要按升序排序,请指定 asc
。
可以使用 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
运算符,后跟一个或多个条件。 例如,下面的查询仅返回 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,因此必须先将其强制转换为 int
或 long
等数字类型,然后才能对其使用数字运算符,如下所示:SecurityEvent | where toint(Level) >= 10
可使用时间选取器或时间筛选器指定时间范围。
时间选取器显示在“运行”按钮的旁边,指示你只查询过去 24 小时的记录。 此默认时间范围应用于所有查询。 如果只需过去一个小时的记录,请选择“过去一小时”并再次运行查询。
还可以通过将时间筛选器添加到查询来定义自己的时间范围。 添加时间筛选器将覆盖时间选取器中选择的时间范围。
最好是紧接在表名后面添加时间筛选器:
SecurityEvent
| where TimeGenerated > ago(30m)
| where toint(Level) >= 10
在前面的时间筛选器中,ago(30m)
表示“30 分钟前”。此查询仅返回过去 30 分钟的记录(例如,表示为 30m)。 其他时间单位包括天(例如 2d)以及秒(例如 10s)。
使用project
可以选择要包含在结果中的特定列:
SecurityEvent
| top 10 by TimeGenerated
| project TimeGenerated, Computer, Activity
上面的示例生成以下输出:
还可以使用project
来重命名列,并定义新列。 下一个示例使用 project
执行以下操作:
Computer
和 TimeGenerated
原始列。Activity
列显示为 EventDetails
。EventCode
的新列。 substring()
函数用于仅获取 Activity
字段中的前 4 个字符。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
,可以返回每个组中的结果数。
以下查询检查过去一小时的所有 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 Monitor 日志中存在重复记录。 这种重复通常起因于以下两种情况之一:
培训
模块
引导式项目 - 使用 KQL 分析 Azure Monitor 中的日志 - Training
编写日志查询,深入了解你的业务、IT 运营和性能。 使用 Kusto 查询语言 (KQL) 提取 Azure Monitor Log Analytics 中的日志数据。