你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure Monitor 中的日志查询入门

注意

如果要从至少一个虚拟机收集数据,你可以在自己的环境中完成此练习。 对于其他应用场景,请使用演示环境,它包含大量示例数据。

如果已知道如何使用 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

使用 take 运算符通过返回最多为指定数量的记录来查看记录的小样本。 所选结果是任意的,并且不按特定顺序显示。 如果需要按特定顺序返回结果,请使用 sorttop 运算符

搜索查询

搜索查询的结构较简单。 它们通常更适合用于查找在任何列中包含特定值的记录:

search in (SecurityEvent) "Cryptographic"
| take 10

此查询会在 SecurityEvent 表中搜索包含“Cryptographic”一词的记录。在这些记录中,将返回并显示 10 条记录。 如果省略 in (SecurityEvent) 部分且仅运行 search "Cryptographic",那么搜索将查找所有表。 此过程则会花费更长时间,而且效率更低。

重要

搜索查询通常比基于表的查询更慢,因为它们必须处理更多的数据。

sort 和 top

本部分介绍了 sorttop 运算符及其参数 descasc。 虽然 take 可用于获取一些记录,但不能按任何特定顺序选择或对结果进行排序。 要获取排序的视图,请使用 sorttop

降序和升序

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

输出如下例所示。

屏幕截图显示前 10 条记录,按降序排序。

where 运算符:按条件筛选

顾名思义,筛选器可按特定的条件筛选数据。 要将查询结果限制为相关信息,最常用的方法是筛选。

要将筛选器添加到查询,请使用 where 运算符,后跟一个或多个条件。 例如,下面的查询仅返回 SecurityEvent 记录,其中 Level equals _8

SecurityEvent
| where Level == 8

编写筛选条件时,可使用以下表达式:

表达式 描述 示例
== 检查相等性
(区分大小写)
Level == 8
=~ 检查相等性
(不区分大小写)
EventSourceName =~ "microsoft-windows-security-auditing"
!=, <> 检查不相等性
(两个表达式相同)
Level != 4
andor 需在条件之间使用 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 小时的记录。 此默认时间范围应用于所有查询。 如果只需过去一个小时的记录,请选择“过去一小时”并再次运行查询。

屏幕截图显示时间选取器及其时间范围命令列表。

向查询添加时间筛选器

还可以通过将时间筛选器添加到查询来定义自己的时间范围。 添加时间筛选器将覆盖时间选取器中选择的时间范围。

最好是紧接在表名后面添加时间筛选器:

SecurityEvent
| where TimeGenerated > ago(30m) 
| where toint(Level) >= 10

在前面的时间筛选器中,ago(30m) 表示“30 分钟前”。此查询仅返回过去 30 分钟的记录(例如,表示为 30m)。 其他时间单位包括天(例如 2d)以及秒(例如 10s)。

使用 project 和 extend 来选择和计算列

使用project可以选择要包含在结果中的特定列:

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

上面的示例生成以下输出:

屏幕截图显示“project”查询的结果列表。

还可以使用project来重命名列,并定义新列。 下一个示例使用 project 执行以下操作:

  • 仅选择 ComputerTimeGenerated 原始列。
  • 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 可以根据一个或多个列标识记录组,并向其应用聚合。 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

遗憾的是,此查询的结果没有意义,因为我们混合了不同的性能计数器。 若要使结果更有意义,可分别计算每个 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)

若要使输出更清晰,可选择通过时间图表的形式显示一段时间内的可用内存。

屏幕截图显示一段时间内的查询内存值。

常见问题解答

本部分提供常见问题的解答。

为什么我在 Azure Monitor 日志中看到了重复记录?

你偶尔可能会注意到 Azure Monitor 日志中存在重复记录。 这种重复通常起因于以下两种情况之一:

  • 管道中的组件进行了重试,以确保在目标位置可靠地完成交付。 此功能偶尔会导致一小部分的遥测项出现重复。
  • 如果重复记录来自虚拟机,则表明你可能同时安装了 Log Analytics 代理和 Azure Monitor 代理。 如果你仍然需要安装 Log Analytics 代理,请将 Log Analytics 工作区配置为不再收集那些也由 Azure Monitor 代理使用的数据收集规则收集的数据。

后续步骤