自定义 Azure 日志

编辑

版本

0.1.0 [测试版] 此功能为测试版,可能会发生更改。设计和代码不如官方 GA 功能成熟,并且按“原样”提供,不提供任何保证。测试版功能不受官方 GA 功能的支持 SLA 的约束。 (查看全部)

兼容的 Kibana 版本

8.13.0 或更高版本

支持的无服务器项目类型
这是什么?

安全性
可观测性

订阅级别
这是什么?

基本

支持级别
这是什么?

Elastic

自定义 Azure 日志集成从 Azure 事件中心收集日志。

使用此集成从以下位置收集日志

  • 支持将日志导出到事件中心的 Azure 服务
  • 任何其他可以将日志发送到事件中心的源

数据流

编辑

自定义 Azure 日志集成仅支持日志数据流。

此自定义集成不使用预定义的 Elastic 数据流(如标准集成那样,例如活动日志的 logs-azure.activitylogs-default)。您可以在配置集成时通过选择您选择的数据集和命名空间来控制并构建您自己的数据流。

例如,如果选择 mydataset 作为数据集,default 作为命名空间,则集成会将数据发送到 logs-mydataset-default 数据流。

该集成使用 logs-mydataset-* 索引模式设置名为 logs-mydataset 的专用索引模板。然后,您可以使用自定义管道和自定义映射对其进行自定义。

自定义日志集成使您能够灵活地根据需要配置集成。

要求

编辑

您需要 Elasticsearch 来存储和搜索数据,并需要 Kibana 来可视化和管理数据。您可以使用我们推荐的托管在 Elastic Cloud 上的 Elasticsearch Service,也可以在您自己的硬件上自行管理 Elastic Stack。

在使用自定义 Azure 日志之前,您需要

  • 一个 事件中心,用于存储 Azure 服务(或其他源)导出的正在传输的日志,并使其可供 Elastic Agent 使用。
  • 一个 存储帐户,用于存储有关 Elastic Agent 使用的日志的检查点信息。
事件中心
编辑

Azure 事件中心是一个数据流平台和事件引入服务,可以接收并临时存储数百万个事件。

具有自定义 Azure 日志集成的 Elastic Agent 将使用来自事件中心服务的日志。

  ┌────────────────┐      ┌───────────┐
  │   myeventhub   │      │  Elastic  │
  │ <<Event Hub>>  │─────▶│   Agent   │
  └────────────────┘      └───────────┘

要了解有关事件中心的更多信息,请参阅 Azure 事件中心的功能和术语

存储帐户容器
编辑

存储帐户是一种多功能的 Azure 服务,允许您将数据存储在各种存储类型中,包括 Blob、文件共享、队列、表和磁盘。

自定义 Azure 日志集成需要存储帐户容器才能工作。

该集成使用存储帐户容器进行检查点操作。它存储有关使用者组(状态、位置或偏移量)的数据,并在 Elastic Agent 之间共享。共享此类信息允许多个分配给同一代理策略的 Elastic Agent 协同工作,从而在需要时实现日志处理的水平扩展。

  ┌────────────────┐                     ┌───────────┐
  │   myeventhub   │        logs         │  Elastic  │
  │ <<event hub>>  │────────────────────▶│   Agent   │
  └────────────────┘                     └───────────┘
                                                │
                       consumer group info      │
  ┌────────────────┐   (state, position, or     │
  │ log-myeventhub │         offset)            │
  │ <<container>>  │◀───────────────────────────┘
  └────────────────┘

Elastic Agent 会为自定义 Azure 日志集成自动创建一个容器,并为事件中心上的每个分区创建一个 Blob。

例如,如果将集成配置为从具有四个分区的事件中心获取数据,则 Agent 将创建以下内容

  • 一个存储帐户容器。
  • 该容器中的四个 Blob。

存储在 Blob 中的信息很小(通常每个 Blob 小于 500 字节),并且经常被访问。Elastic 建议使用热存储层。

只要需要使用 Elastic Agent 运行集成,就需要保留存储帐户容器。如果删除存储帐户容器,Elastic Agent 将停止工作,并在下次启动时创建一个新的容器。

通过删除存储帐户容器,Elastic Agent 将丢失对最后处理的消息的跟踪,并开始从事件中心保留期的开头处理消息。

设置

编辑

在添加集成之前,请完成以下任务。

创建事件中心
编辑

事件中心接收从 Azure 服务导出的日志,并使这些日志可供 Elastic Agent 读取。

以下是所需步骤的概要

  • 创建资源组,或选择现有资源组。
  • 创建事件中心命名空间。
  • 创建事件中心。

有关分步指南,请查看快速入门 使用 Azure 门户创建事件中心

记下事件中心的 名称,稍后在集成设置中指定 eventhub 时将使用该名称。

事件中心命名空间与事件中心
编辑

在集成设置中,您应该使用事件中心名称(而不是事件中心命名空间名称)作为 事件中心 选项的值。

如果您是事件中心的新手,请将事件中心命名空间视为群集,将事件中心视为主题。您通常会有一个群集和多个主题。

如果您熟悉 Kafka,则以下是两者之间的概念映射

Kafka 概念 事件中心概念

群集

命名空间

主题

事件中心

分区

分区

使用者组

使用者组

偏移量

偏移量

多少个分区?
编辑

分区的数量对于平衡事件中心的成本和性能至关重要。

以下是一些使用一个或多个代理的示例,其中提供了有关为您的用例选择正确的分区数的建议。

单个代理编辑

对于单个代理部署,增加事件中心上的分区数是提高性能的主要驱动力。代理为每个分区创建一个工作进程。

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐    ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│                         │    │                         │

│   ┌─────────────────┐   │    │   ┌─────────────────┐   │
    │   partition 0   │◀───────────│     worker      │
│   └─────────────────┘   │    │   └─────────────────┘   │
    ┌─────────────────┐            ┌─────────────────┐
│   │   partition 1   │◀──┼────┼───│     worker      │   │
    └─────────────────┘            └─────────────────┘
│   ┌─────────────────┐   │    │   ┌─────────────────┐   │
    │   partition 2   │◀────────── │     worker      │
│   └─────────────────┘   │    │   └─────────────────┘   │
    ┌─────────────────┐            ┌─────────────────┐
│   │   partition 3   │◀──┼────┼───│     worker      │   │
    └─────────────────┘            └─────────────────┘
│                         │    │                         │

│                         │    │                         │

└ Event hub ─ ─ ─ ─ ─ ─ ─ ┘    └ Elastic Agent ─ ─ ─ ─ ─ ┘
两个或多个 Elastic Agent编辑

对于多个 Elastic Agent,设置分区数至关重要。代理共享现有分区,以扩展性能并提高可用性。

分区数必须至少等于代理数。

┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐    ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐

│                         │    │   ┌─────────────────┐   │
                            ┌──────│     worker      │
│   ┌─────────────────┐   │ │  │   └─────────────────┘   │
    │   partition 0   │◀────┘      ┌─────────────────┐
│   └─────────────────┘   │ ┌──┼───│     worker      │   │
    ┌─────────────────┐     │      └─────────────────┘
│   │   partition 1   │◀──┼─┘  │                         │
    └─────────────────┘         ─Agent─ ─ ─ ─ ─ ─ ─ ─ ─ ─
│   ┌─────────────────┐   │    ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
    │   partition 2   │◀────┐
│   └─────────────────┘   │ │  │  ┌─────────────────┐    │
    ┌─────────────────┐     └─────│     worker      │
│   │   partition 3   │◀──┼─┐  │  └─────────────────┘    │
    └─────────────────┘     │     ┌─────────────────┐
│                         │ └──┼──│     worker      │    │
                                  └─────────────────┘
│                         │    │                         │

└ Event hub ─ ─ ─ ─ ─ ─ ─ ┘    └ Elastic Agent ─ ─ ─ ─ ─ ┘
建议编辑

创建一个至少具有两个分区的事件中心。两个分区允许低容量部署,以支持两个代理的高可用性。考虑创建四个或更多分区以处理具有可用性的中等容量部署。

要了解有关事件中心分区的更多信息,请查看 Microsoft 的本指南:https://learn.microsoft.com/zh-cn/azure/event-hubs/event-hubs-create

要从性能的角度了解有关事件中心分区的更多信息,请查看以可扩展性为重点的文档:https://learn.microsoft.com/zh-cn/azure/event-hubs/event-hubs-scalability#partitions

使用者组
编辑

与所有其他事件中心客户端一样,Elastic Agent 需要一个使用者组名称才能访问事件中心。

使用者组是整个事件中心的视图(状态、位置或偏移量)。使用者组使多个代理可以拥有事件流的单独视图,并以自己的速度和偏移量独立读取日志。

使用者组允许多个分配给同一代理策略的 Elastic Agent 协同工作,从而在需要时实现日志处理的水平扩展。

在大多数情况下,您可以使用名为 $Default 的默认使用者组。如果 $Default 已被其他应用程序使用,您可以创建一个专用于 Azure 日志集成的使用者组。

连接字符串
编辑

Elastic Agent 需要连接字符串才能访问事件中心并获取导出的日志。连接字符串包含有关所用事件中心和访问它所需的凭据的详细信息。

要获取事件中心命名空间的连接字符串

  1. 访问您在上一步中创建的 事件中心命名空间
  2. 选择 设置 > 共享访问策略

创建一个新的共享访问策略 (SAS)

  1. 选择 添加 以打开创建面板。
  2. 添加一个 策略名称(例如,“ElasticAgent”)。
  3. 选择 侦听 声明。
  4. 单击 创建

当 SAS 策略准备就绪后,选择它以显示信息面板。

记下 连接字符串–主密钥,稍后在集成设置中指定 connection_string 时将使用该密钥。

创建诊断设置
编辑

诊断设置将 Azure 服务的日志导出到目标位置,并且要使用 Azure 日志集成,它必须是事件中心。

要创建用于导出日志的诊断设置

  1. 找到服务的诊断设置(例如,Microsoft Entra ID)。
  2. 在服务的 监视 部分中选择诊断设置。请注意,不同的服务可能会将诊断设置放置在不同的位置。
  3. 选择 添加诊断设置

在诊断设置页面中,您必须选择要导出的源日志类别,然后选择其目标位置。

选择日志类别
编辑

每个 Azure 服务都会导出一个定义良好的日志类别列表。请查看单独的集成文档以检查支持的日志类别。

选择目标
编辑

选择您之前创建的 订阅事件中心命名空间。选择专用于此集成的事件中心。

  ┌───────────────┐   ┌──────────────┐   ┌───────────────┐      ┌───────────┐
  │  MS Entra ID  │   │  Diagnostic  │   │     adlogs    │      │  Elastic  │
  │  <<service>>  ├──▶│   Settings   │──▶│ <<event hub>> │─────▶│   Agent   │
  └───────────────┘   └──────────────┘   └───────────────┘      └───────────┘
创建存储帐户容器
编辑

Elastic Agent 将消费者组信息(状态、位置或偏移量)存储在存储帐户容器中。使所有代理都可以访问此信息,可以使它们共享日志处理,并在重启后从上次处理的日志继续。

仅将存储帐户用作检查点存储。

要创建存储帐户

  1. 登录到 Azure 门户 并创建您的存储帐户。
  2. 在配置项目详细信息时,请确保选择以下建议的默认设置

    • 分层命名空间:禁用
    • 最低 TLS 版本:版本 1.2
    • 访问层:热
    • 启用 Blob 的软删除:禁用
    • 启用容器的软删除:禁用
  3. 当新的存储帐户准备就绪时,请记下存储帐户名称和访问密钥,因为您稍后将使用它们来验证 Elastic 应用程序对该存储帐户的请求。

这是从 Azure Monitor 服务收集活动日志的设置的最终示意图。

 ┌───────────────┐   ┌──────────────┐   ┌────────────────┐         ┌───────────┐
 │  MS Entra ID  │   │  Diagnostic  │   │     adlogs     │  logs   │  Elastic  │
 │  <<service>>  ├──▶│   Settings   │──▶│ <<event hub>>  │────────▶│   Agent   │
 └───────────────┘   └──────────────┘   └────────────────┘         └───────────┘
                                                                          │
                     ┌──────────────┐          consumer group info        │
                     │  azurelogs   │          (state, position, or       │
                     │<<container>> │◀───────────────offset)──────────────┘
                     └──────────────┘
存储帐户容器?
编辑

Elastic Agent 可以将一个存储帐户 (SA) 用于多个集成。

代理会为集成创建一个 SA 容器。SA 容器名称结合了事件中心名称和一个前缀 (azure-eventhub-input-[eventhub])。

在防火墙后运行集成
编辑

当您在防火墙后运行 Elastic Agent 时,您必须允许事件中心使用端口 56715672 以及存储帐户容器使用端口 443 的流量,以确保与必要组件的正常通信。

┌────────────────────────────────┐  ┌───────────────────┐  ┌───────────────────┐
│                                │  │                   │  │                   │
│ ┌────────────┐   ┌───────────┐ │  │  ┌──────────────┐ │  │ ┌───────────────┐ │
│ │ diagnostic │   │ event hub │ │  │  │azure-eventhub│ │  │ │ activity logs │ │
│ │  setting   │──▶│           │◀┼AMQP─│  <<input>>   │─┼──┼▶│<<data stream>>│ │
│ └────────────┘   └───────────┘ │  │  └──────────────┘ │  │ └───────────────┘ │
│                                │  │          │        │  │                   │
│                                │  │          │        │  │                   │
│                                │  │          │        │  │                   │
│         ┌─────────────┬─────HTTPS─┼──────────┘        │  │                   │
│ ┌───────┼─────────────┼──────┐ │  │                   │  │                   │
│ │       │             │      │ │  │                   │  │                   │
│ │       ▼             ▼      │ │  └─Agent─────────────┘  └─Elastic Cloud─────┘
│ │ ┌──────────┐  ┌──────────┐ │ │
│ │ │    0     │  │    1     │ │ │
│ │ │ <<blob>> │  │ <<blob>> │ │ │
│ │ └──────────┘  └──────────┘ │ │
│ │                            │ │
│ │                            │ │
│ └─Storage Account Container──┘ │
│                                │
│                                │
└─Azure──────────────────────────┘
事件中心
编辑

端口 56715672 通常用于与事件中心进行安全通信。这些端口用于接收事件。Elastic Agent 可以通过允许在这些端口上的流量与事件中心建立安全连接。

有关详细信息,请查看以下文档

存储帐户容器
编辑

端口 443 用于与存储帐户容器进行安全通信。此端口通常用于 HTTPS 流量。通过允许端口 443 上的流量,Elastic Agent 可以安全地访问和与存储帐户容器交互,这对于存储和检索每个事件中心分区的检查点数据至关重要。

(可选)您可以将流量限制为以下域名

*.servicebus.windows.net
*.blob.core.windows.net
*.cloudapp.net

设置

编辑

当您将 Azure 日志集成添加到 Fleet 时,请使用以下设置进行配置。

eventhub : 字符串 一项完全托管的实时数据引入服务。Elastic 建议事件中心名称仅使用字母、数字和连字符 (-),以最大限度地提高兼容性。您可以使用事件中心名称中带有下划线 (_) 的现有事件中心;在这种情况下,当集成使用事件中心名称在后台创建依赖的 Azure 资源时(例如,存储事件中心使用者偏移量的存储帐户容器),它将以下划线替换为连字符 (-)。Elastic 还建议每个日志类型使用单独的事件中心,因为每个日志类型的字段映射不同。默认值 insights-operational-logs

consumer_group : 字符串 使用使用者组启用事件中心的发布/订阅机制。使用者组是整个事件中心的视图(状态、位置或偏移量)。使用者组使多个使用应用程序可以各自拥有事件流的单独视图,并以它们自己的速度和偏移量独立读取该流。默认值: $Default

connection_string : 字符串

需要连接字符串才能与事件中心通信。有关详细信息,请查看 获取事件中心连接字符串

需要 Blob 存储帐户来存储/检索/更新事件中心消息的检查点信息。这允许集成在用户停止它时恢复处理剩余的消息。

storage_account : 字符串 存储检查点信息的存储帐户的名称。storage_account_key : 字符串 存储帐户密钥。用于授权访问您的存储帐户中的数据的密钥。

storage_account_container : 字符串 存储帐户容器是集成存储使用者组的检查点数据的位置。这是一个需要非常谨慎使用的高级选项。您必须为每个 Azure 日志类型(活动日志、登录日志、审核日志等)使用专用的存储帐户容器。不要为多个 Azure 日志类型重复使用相同的容器名称。有关 Microsoft 命名规则的详细信息,请查看 容器名称。如果未指定,集成将生成默认容器名称。

pipeline : 字符串 可选。覆盖此集成的默认摄取管道。

resource_manager_endpoint : 字符串 可选。默认情况下,集成使用 Azure 公共环境。要覆盖此设置并使用不同的 Azure 环境,用户可以提供特定的资源管理器终结点。

示例

  • Azure 中国云:https://management.chinacloudapi.cn/
  • Azure 德国云:https://management.microsoftazure.de/
  • Azure 公有云:https://management.azure.com/
  • Azure 美国政府云:https://management.usgovcloudapi.net/

此设置还可以定义您的终结点,例如混合云模型。

处理 Azure 日志中的格式不正确的 JSON

编辑

据观察,Azure 服务有时会发送 格式不正确的 JSON 文档。这些日志可能会破坏预期的 JSON 格式,并导致在处理过程中出现解析问题。

为了解决此问题,每个数据流的高级设置部分提供了两个清理选项

  • 清理换行符:删除日志中的换行符。
  • 清理单引号:将日志中的单引号替换为双引号,但不包括双引号内的单引号。

可以通过以下方式识别格式不正确的日志

  • 消息字段中存在 records 数组表示无法反序列化字节切片。
  • 存在包含文本“从 Azure 云平台接收到无效的 JSON。无法解析源日志消息。”的 error.message 字段。

可能产生格式不正确的日志的已知数据流

  • 平台日志
  • Spring Apps 日志
  • PostgreSQL 灵活服务器日志

变更日志

编辑
变更日志
版本 详细信息 Kibana 版本

0.1.0

增强功能 (查看拉取请求)
添加自定义 Azure 日志,以从 Azure 事件中心收集日志事件