使用弹性堆栈进行日志记录

小窍门

此内容摘自电子书《为 Azure 架构云原生 .NET 应用程序》,可在 .NET 文档 查阅或下载免费的 PDF 离线阅读。

Azure 平台的云原生 .NET 应用电子书封面缩略图。

有许多良好的集中式日志记录工具,它们的成本从免费开源工具到更昂贵的选项不等。 在许多情况下,免费工具和付费产品/服务一样好或更好。 其中一种工具是三个开源组件的组合:Elasticsearch、Logstash 和 Kibana。

这些工具统称为弹性堆栈或 ELK 堆栈。

弹性堆栈

弹性堆栈是用于从 Kubernetes 群集收集信息的强大选项。 Kubernetes 支持将日志发送到 Elasticsearch 终结点,在大多数情况下,只需设置环境变量,如图 7-5 所示:

KUBE_LOGGING_DESTINATION=elasticsearch
KUBE_ENABLE_NODE_LOGGING=true

图 7-5. Kubernetes 的配置变量

此步骤将在集群上安装 Elasticsearch,并将所有集群日志发送到 Elasticsearch。

Kibana 仪表板示例,其中显示了针对从 Kubernetes 引入的日志的查询结果 图 7-6。 Kibana 仪表板示例,其中显示了针对从 Kubernetes 引入的日志的查询结果

有关配置的详细信息,请参阅“配置日志记录”(Kibana)。

弹性堆栈的优点是什么?

Elastic Stack 以低成本、可缩放的云友好方式提供集中式日志记录。 它的用户界面简化了数据分析,因此你可以花时间从数据中收集见解,而不是与笨拙的界面作斗争。 它支持多种输入数据,因此,随着您的分布式应用程序扩展到更多不同类型的服务,您可以继续将日志数据和指标数据馈送到系统中。 Elastic Stack 还支持跨大型数据集进行快速搜索,甚至使大型应用程序能够记录详细数据,并且仍能够以高性能方式查看这些数据。

Logstash

第一个组件是 Logstash。 此工具用于收集来自各种不同源的日志信息。 例如,Logstash 可以从磁盘读取日志,还可以从日志记录库(如 Serilog)接收消息。 Logstash 可以在日志到达时对日志执行一些基本筛选和扩展。 例如,如果日志包含 IP 地址,则可以将 Logstash 配置为执行地理查找,并获取该消息的国家/地区甚至来源城市。

Serilog 是适用于 .NET 语言的日志记录库,可用于参数化日志记录。 参数是分开保留的,而不是生成嵌入字段的文本日志消息。 此库允许更智能地筛选和搜索。 写入 Logstash 的示例 Serilog 配置显示在图 7-7 中。

var log = new LoggerConfiguration()
         .WriteTo.Http("http://localhost:8080")
         .CreateLogger();

图 7-7. Serilog 配置,用于通过 HTTP 直接将日志信息写入 logstash

Logstash 将使用类似于图 7-8 中显示的配置。

input {
    http {
        #default host 0.0.0.0:8080
        codec => json
    }
}

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        index=>"sales-%{+xxxx.ww}"
    }
}

图 7-8. 用于使用 Serilog 中的日志的 Logstash 配置

在不需要大量日志处理的情况下,有一种替代 Logstash 的工具称为 Beats。 Beats 是一系列工具,可以收集各种数据,从日志到网络数据和运行时间信息。 许多应用程序都将使用 Logstash 和 Beats。

Logstash 收集日志后,需要将日志放在某个位置。 虽然 Logstash 支持许多不同的输出,但更令人兴奋的输出之一是 Elasticsearch。

Elasticsearch

Elasticsearch 是一个功能强大的搜索引擎,可以在日志到达时为日志编制索引。 它可快速针对日志运行查询。 Elasticsearch 可以处理大量的日志,在极端情况下,可以跨多个节点横向扩展。

可以直接查询创建出来用于包含参数的日志消息或通过 Logstash 处理已拆分参数的日志消息,因为 Elasticsearch 保留了此信息

图 7-9 中显示了一个查询,该查询搜索 jill@example.com 访问的前 10 页。

"query": {
    "match": {
      "user": "jill@example.com"
    }
  },
  "aggregations": {
    "top_10_pages": {
      "terms": {
        "field": "page",
        "size": 10
      }
    }
  }

图 7-9. 用于查找用户访问的前 10 页的 Elasticsearch 查询

使用 Kibana Web 仪表板可视化信息

堆栈的最后一个组件是 Kibana。 此工具用于在 Web 仪表板中提供交互式可视化效果。 即使非技术用户也能创建仪表板。 大多数驻留在 Elasticsearch 索引中的数据都可以包含在 Kibana 仪表板中。 单个用户可能有不同的仪表板需求,Kibana 通过提供用户特定的仪表板来实现这种自定义。

在 Azure 上安装 Elastic Stack

弹性堆栈可以通过多种方式安装在 Azure 上。 与往常一样,可以 预配虚拟机并直接在虚拟机上安装 Elastic Stack。 一些经验丰富的用户首选此选项,因为它提供最高程度的可自定义性。 在基础结构即服务上部署会产生大量的管理开销,强制那些采用该路径的人取得与基础结构即服务关联的所有任务(例如保护计算机并更新修补程序)的所有权。

开销较低的选项是使用已配置 Elastic Stack 的众多 Docker 容器之一。 这些容器可以放入现有的 Kubernetes 群集,并连同应用程序代码一起运行。 sebp/elk 容器是一个有记录且经过测试的弹性堆栈容器。

另一种选择是最近宣布的 ELK 即服务解决方案。

参考文献