在 Azure Monitor 中编写有效的日志查询
本文提供有关在 Azure Monitor 中编写有效日志查询的建议。 使用这些策略可确保以最低的开销快速运行查询。
限定查询范围
如果查询处理的数据多过实际需要处理的数据,则查询可能会长时间运行,并且往往会在结果中返回过多的数据,从而影响分析的效率。 在极端情况下,查询甚至可能会超时并失败。
指定数据源
编写有效查询的第一步是将查询范围限定为所需的数据源。 指定某个表始终优先于运行宽泛的文本搜索(例如 search *
)。 若要查询特定的表,请先在查询中指定表名,如下所示:
requests | ...
可以在查询中使用 search 来搜索特定表中多个列内的某个值,如下所示:
search in (exceptions) "The server was not found"
search in (exceptions, customEvents) "timeout"
使用 union 可以查询多个表,如下所示:
union requests, traces | ...
指定时间范围
还应将查询限制为所需数据的时间范围。 默认情况下,查询包括过去 24 小时内收集的数据。 可以在时间范围选择器中更改该选项,或将其显式添加到查询。 最好是紧接在表名后面添加时间筛选器,使剩余的查询部分只处理该范围内的数据:
requests | where timestamp > ago(1h)
requests | where timestamp between (ago(1h) .. ago(30m))
仅获取最新记录
如果只想返回最新记录,请按以下查询中所示使用 top 运算符,以返回 traces 表中记录的最新 10 条记录:
traces | top 10 by timestamp
筛选记录
如果只想查看与给定条件匹配的日志,请按以下查询中所示使用 where 运算符,以便仅返回 severityLevel 值大于 0 的记录:
traces | where severityLevel > 0
字符串比较
评估字符串时,通常会使用 has
而不是 contains
来查找完整令牌。 has
更加有效,因为它不需要查找子字符串。
返回的列
使用 project 将所要处理的列集范围缩小为所需的列:
traces
| project timestamp, severityLevel, client_City
| ...
尽管可以使用 extend 来计算值和创建自己的列,但基于表列进行筛选通常更加有效。
例如,以下第一查询基于 operation_Name 进行筛选,第二个查询创建新的 subscription 列并基于此列进行筛选,前者比后者更有效:
customEvents
| where split(operation_Name, "/")[2] == "acb"
customEvents
| extend subscription = split(operation_Name, "/")[2]
| where subscription == "acb"
使用联接
使用 join 运算符时,请在查询的左侧选择行数更少的表。
后续步骤
若要详细了解查询的最佳做法,请参阅查询最佳做法。