Log analytics 和 KQL 查询

已完成

随着我们开始关注服务的可靠性,需要一种方法来跟踪它们做得多好(或者多不好)。 通常,可以在服务日志中找到此信息,因此需要一个工具来处理这些日志。 Log Analytics 是我们在 Azure 中用于此目的的工具。 这样就可以查询这些数据,并以对可靠性工作非常有用的方式显示数据。

日志分析查询过程涉及以 Kusto 查询语言 (KQL) 编写查询。 如果曾经使用过任何其他查询语言(例如结构化查询语言,就是大多数人知道的 SQL),则使用 KQL 将不会有问题。 即使未曾用过,只要看过一次它的工作原理,可能会发现基本 KQL 查询非常简单。

Log Analytics 工作原理

我们来看看它是如何工作的。 下面是 Log Analytics 工作原理的示意图:

Diagram of Log Analytics overview showing data inputs, tables, and sample queries.

Log Analytics 的数据来自多个源,包括:

  • Windows 事件日志
  • Linux 计算机上的 syslog
  • VM 上运行的代理
  • 人们选择发送到的自定义日志
  • 来自 Azure 资源的指标
  • 来自 Application Insights 的遥测信息

所有这些信息都去到 Log Analytics 称之为“表”的地方。 可将每个表视为单独的数据库。 将编写查询,从表中提取信息。 对于本模块稍后将展示的例子,将主要使用名为“请求”的表。

Diagram of Log Analytics overview with requests table highlighted.

Log Analytics 界面

下图显示了 Log Analytics 界面的不同部分。

Screenshot of the Log Analytics workspace in the Azure portal.

左侧屏幕保证在使用 Log Analytics 时你不会“走丢”。 它显示可能正在使用的表,并且如果展开某个部分,将看到可供查询的表中的字段列表。 如果选择任何字段或表名称,将复制到查询构造区域。

查询构造区域位于顶部。 这是指定查询并运行它的位置。 如果数据尚未指定为查询的一部分,则可以提供数据的时间范围。 如果希望一次处理多个查询,可以保存查询或打开其他选项卡。

页面底部的信息更有用。 此处 Log Analytics 会显示以前运行的查询,如果需要返回到之前指定的内容,这会很有用;例如,如果正在处理一个查询,尝试了某项操作,不得不原路返回。

编写 KQL 查询

KQL 是功能强大的查询语言。 只需通过一些基本查询来简单了解一下,就可以看到它用起来是多么容易。 稍后,如果想要深入了解如何使用一些更为高级的功能(包括一些机器学习功能),请务必查看 Log Analytics 教程

首先编写简单的 KQL 查询。 几乎所有 KQL 查询都是从数据源(即要查询的表)开始的。 如果从“请求”表中查询数据,则先在查询区域执行此操作:

Requests

KQL 查询的下一部分是将表与要执行的操作关联。 在表名称和命令之间使用竖线字符(键盘上通常位于斜杠键上方的水平条)。

下面是一个简单查询,对表进行分类,返回找到的前 10 条记录:

Requests
|top 10

下面是除了“前 10 条”外可能用到的其他常见命令的一些示例:

  • 若要查看任何随机的 10 条记录而不是前 10 条(例如为了查看表结构),可使用以下命令:

    requests
    |take 10
    
  • 若要查看过去半小时内传入的记录,可以使用以下查询:

    requests
    |where timestamp > ago(30m)
    
  • 另一项常见任务是指定返回数据的顺序。 下面是按特定字段(时间戳)以降序(例如最新数据排在第一位)排列查询的示例:

    requests
    |sort by timestamp desc
    

与 SQL 一样,可以设置多个条件来指定要返回的记录。 使用其他竖线字符和子句来添加它们。 竖线字符将命令隔开,因此第一个命令的输出将是下一个命令的输入。 单个查询可以有任意数量的命令。

下面是过去 30 分钟内返回所有 404 响应代码记录(例如来自 Web 服务的所有“页面未找到”记录)的查询示例:

requests
|where timestamp > ago(30m)
|where toint(resultCode) == 404

此查询旨在最大程度地提高效率。 首先只是选择最近 30 分钟内的记录,可以显著减少第二个子句必须扫描的记录数。 如果以相反的顺序编写此查询,则首先从一开始就查找数据中的所有 404 记录,然后舍弃绝大部分记录,只提供过去半小时的记录。 编写包含多个条件的查询时,请始终考虑处理的顺序。

我们来看最后一个查询示例,本模块后面将再次涉及 Log Analytics 的强大功能,帮助提高可靠性。 下面是一个基于数据显示计算结果的查询:

requests
|where timestamp > ago(30m)
|summarize count() by name, URL

此查询返回过去半个小时内收到的请求的摘要。 因此在 Web 服务中,它可能告诉我们,有一个针对 URL http://tailwindtraders.comGET index.html 请求,共请求 2,875 次。 我们暂停一下对此查询中 KQL 的关注,因为在后面的单元中会再次邂逅 KQL 查询。

知识检查

1.

采用哪种语言编写日志分析查询?

2.

KQL 的全称是什么?

3.

在大多数 KQL 查询中,Log Analytics 中的数据存储在何处?从何处进行查询?