基于提示的自动发现

编辑

Filebeat 支持基于提供程序提示的自动发现。提示系统会在 Kubernetes Pod 注释或 Docker 标签中查找带有前缀 co.elastic.logs 的提示。一旦容器启动,Filebeat 将检查它是否包含任何提示,并为其启动相应的配置。提示告诉 Filebeat 如何获取给定容器的日志。默认情况下,将使用 filestream 输入从容器检索日志。您可以使用提示来修改此行为。以下是支持的提示的完整列表

co.elastic.logs/enabled
编辑

默认情况下,Filebeat 从所有容器获取日志,您可以将此提示设置为 false 以忽略容器的输出。Filebeat 不会读取或发送来自它的日志。如果禁用默认配置,则可以使用此注释仅对设置为 true 的容器启用日志检索。如果您打算将其与 Kubernetes 一起使用,请记住,注释值只能是字符串类型,因此您需要将其明确定义为 "true""false"

co.elastic.logs/multiline.*
编辑

多行设置。有关所有受支持选项的完整列表,请参阅多行消息

co.elastic.logs/json.*
编辑

JSON 设置。对于 filestream 输入(默认),有关所有受支持选项的完整列表,请参阅ndjson。对于 containerlog 输入,有关所有受支持选项的完整列表,请参阅json

例如,以下带有 JSON 选项的提示

co.elastic.logs/json.message_key: "log"
co.elastic.logs/json.add_error_key: "true"

将导致以下输入配置

  • filestream
parsers:
  - ndjson:
      message_key: "log"
      add_error_key: "true"
  • log
json.message_key: "log"
json.add_error_key: "true"

log 输入的 keys_under_root JSON 选项在 filestream 输入中被 target 选项替换。阅读文档(ndjson)了解如何正确使用它。

co.elastic.logs/include_lines
编辑

您希望 Filebeat 包含的行匹配的正则表达式列表。有关更多信息,请参阅输入

co.elastic.logs/exclude_lines
编辑

您希望 Filebeat 排除的行匹配的正则表达式列表。有关更多信息,请参阅输入

co.elastic.logs/module
编辑

指定要用于解析来自容器的日志的模块,而不是使用原始 docker 输入。有关支持的模块列表,请参阅模块

co.elastic.logs/fileset
编辑

配置模块后,将容器日志映射到模块文件集。您可以像这样配置单个文件集

co.elastic.logs/fileset: access

或者配置容器中每个流(stdout 和 stderr)的文件集

co.elastic.logs/fileset.stdout: access
co.elastic.logs/fileset.stderr: error
co.elastic.logs/raw
编辑

当需要完全设置整个输入/模块配置时,可以使用 raw 提示。您可以提供输入配置的字符串化 JSON。raw 会覆盖所有其他提示,并且可以用于创建单个或多个配置。

co.elastic.logs/raw: "[{\"containers\":{\"ids\":[\"${data.container.id}\"]},\"multiline\":{\"negate\":\"true\",\"pattern\":\"^test\"},\"type\":\"docker\"}]"
co.elastic.logs/processors
编辑

定义要添加到 Filebeat 输入/模块配置的处理器。有关支持的处理器列表,请参阅处理器

如果处理器配置使用列表数据结构,则必须枚举对象字段。例如,以下 rename 处理器配置的提示

processors:
  - rename:
      fields:
        - from: "a.g"
          to: "e.d"
      fail_on_error: true

将如下所示

co.elastic.logs/processors.rename.fields.0.from: "a.g"
co.elastic.logs/processors.rename.fields.1.to: "e.d"
co.elastic.logs/processors.rename.fail_on_error: 'true'

如果处理器配置使用映射数据结构,则不需要枚举。例如,与以下 add_fields 配置等效的配置

processors:
  - add_fields:
      target: project
      fields:
        name: myproject

co.elastic.logs/processors.1.add_fields.target: "project"
co.elastic.logs/processors.1.add_fields.fields.name: "myproject"

为了提供处理器定义的顺序,可以提供数字。如果不是,提示构建器将进行任意排序

co.elastic.logs/processors.1.dissect.tokenizer: "%{key1} %{key2}"
co.elastic.logs/processors.dissect.tokenizer: "%{key2} %{key1}"

在上面的示例中,标记为 1 的处理器定义将首先执行。

co.elastic.logs/pipeline
编辑

定义要添加到 Filebeat 输入/模块配置的摄取管道 ID。

co.elastic.logs/pipeline: custom-pipeline

当提示与模板一起使用时,仅当没有解析为 true 的模板条件时,才会评估提示。例如

filebeat.autodiscover.providers:
  - type: docker
    hints.enabled: true
    hints.default_config:
      type: container
      paths:
        - /var/lib/docker/containers/${data.container.id}/*.log
    templates:
      - condition:
          equals:
            docker.container.labels.type: "pipeline"
        config:
          - type: container
            paths:
              - "/var/lib/docker/containers/${data.docker.container.id}/*.log"
            pipeline: my-pipeline

在此示例中,首先评估条件 docker.container.labels.type: "pipeline",如果未匹配,则会处理提示,如果仍然没有有效的配置,则将使用 hints.default_config

Kubernetes

编辑

Kubernetes 自动发现提供程序支持 Pod 注释中的提示。要启用它,只需设置 hints.enabled

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true

您可以配置在看到新容器时将启动的默认配置,如下所示

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true
      hints.default_config:
        type: container
        paths:
          - /var/log/containers/*-${data.container.id}.log  # CRI path

您还可以完全禁用默认设置,因此只会检索注释为 co.elastic.logs/enabled: true 的 Pod

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true
      hints.default_config.enabled: false

您可以使用有用的信息注释 Kubernetes Pod,以启动 Filebeat 输入或模块

annotations:
  co.elastic.logs/multiline.pattern: '^\['
  co.elastic.logs/multiline.negate: true
  co.elastic.logs/multiline.match: after
多个容器
编辑

当一个 Pod 有多个容器时,除非您在提示中放置容器名称,否则设置是共享的。例如,这些提示配置了 Pod 中所有容器的多行设置,但为名为 sidecar 的容器设置了特定的 exclude_lines 提示。

annotations:
  co.elastic.logs/multiline.pattern: '^\['
  co.elastic.logs/multiline.negate: true
  co.elastic.logs/multiline.match: after
  co.elastic.logs.sidecar/exclude_lines: '^DBG'
多组提示
编辑

当一个容器需要在其上定义多个输入时,可以提供带有数字前缀的注释集。如果没有数字前缀的提示,则将它们组合到一个配置中。

annotations:
  co.elastic.logs/exclude_lines: '^DBG'
  co.elastic.logs/1.include_lines: '^DBG'
  co.elastic.logs/1.processors.dissect.tokenizer: "%{key2} %{key1}"

以上配置将生成两个输入配置。第一个输入仅处理调试日志,并通过 dissect 分词器传递。第二个输入处理除调试日志之外的所有内容。

命名空间默认值
编辑

可以在命名空间的注释中配置提示作为在缺少 Pod 级别注释时使用的默认值。生成的提示是 Pod 注释和命名空间注释的组合,其中 Pod 的优先级更高。要启用命名空间默认值,请按如下方式为命名空间对象配置 add_resource_metadata

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true
      add_resource_metadata:
        namespace:
          include_annotations: ["nsannotation1"]

Docker

编辑

Docker 自动发现提供程序支持标签中的提示。要启用它,只需设置 hints.enabled

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true

您可以配置在看到新容器时将启动的默认配置,如下所示

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true
      hints.default_config:
        type: container
        paths:
          - /var/log/containers/*-${data.container.id}.log  # CRI path

您还可以完全禁用默认设置,因此只会检索带有标签 co.elastic.logs/enabled: true 的容器

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true
      hints.default_config.enabled: false

您可以使用有用的信息标记 Docker 容器,以启动 Filebeat 输入,例如

  co.elastic.logs/module: nginx
  co.elastic.logs/fileset.stdout: access
  co.elastic.logs/fileset.stderr: error

上面的标签配置 Filebeat 使用 Nginx 模块来收集此容器的日志。访问日志将从 stdout 流中检索,错误日志将从 stderr 中检索。

您可以使用有用的信息标记 Docker 容器,以解码结构化为 JSON 消息的日志,例如

  co.elastic.logs/json.keys_under_root: true
  co.elastic.logs/json.add_error_key: true
  co.elastic.logs/json.message_key: log

Nomad

编辑

Nomad 自动发现提供程序支持使用 meta的提示。要启用它,只需设置 hints.enabled

filebeat.autodiscover:
  providers:
    - type: nomad
      hints.enabled: true

您可以配置在看到新作业时将启动的默认配置,如下所示

filebeat.autodiscover:
  providers:
    - type: nomad
      hints.enabled: true
      hints.default_config:
        type: log
        paths:
          - /opt/nomad/alloc/${data.nomad.allocation.id}/alloc/logs/${data.nomad.task.name}.*

您还可以禁用默认配置,以便仅收集显式注释为 "co.elastic.logs/enabled" = "true" 的作业的日志

filebeat.autodiscover:
  providers:
    - type: nomad
      hints.enabled: true
      hints.default_config:
        enabled: false
        type: log
        paths:
          - /opt/nomad/alloc/${data.nomad.allocation.id}/alloc/logs/${data.nomad.task.name}.*

您可以使用 meta 节中的有用信息注释 Nomad 作业,以启动 Filebeat 输入或模块

meta {
  "co.elastic.logs/enabled"           = "true"
  "co.elastic.logs/multiline.pattern" = "^\\["
  "co.elastic.logs/multiline.negate"  = "true"
  "co.elastic.logs/multiline.match"   = "after"
}

如果您正在使用自动发现,那么在大多数情况下,您将希望使用 add_nomad_metadata 处理器来使用 Nomad 元数据丰富事件。此示例配置 {Filebeat} 通过 HTTPS 连接到本地 Nomad 代理,并将 Nomad 分配 ID 添加到来自输入的所有事件。稍后,管道中的 add_nomad_metadata 处理器将使用该 ID 来丰富事件。

filebeat.autodiscover:
  providers:
    - type: nomad
      address: https://127.0.0.1:4646
      hints.enabled: true
      hints.default_config:
        enabled: false 
        type: log
        paths:
          - /opt/nomad/alloc/${data.nomad.allocation.id}/alloc/logs/${data.nomad.task.name}.*
        processors:
          - add_fields: 
              target: nomad
              fields:
                allocation.id: ${data.nomad.allocation.id}

processors:
  - add_nomad_metadata: 
      when.has_fields.fields: [nomad.allocation.id]
      address: https://127.0.0.1:4646
      default_indexers.enabled: false
      default_matchers.enabled: false
      indexers:
        - allocation_uuid:
      matchers:
        - fields:
            lookup_fields:
              - 'nomad.allocation.id'

默认配置已禁用,这意味着任何没有 "co.elastic.logs/enabled" = "true" 元数据的任务都将被忽略。

add_fields 处理器使用 Nomad 分配 UUID 填充 nomad.allocation.id 字段。

add_nomad_metadata 处理器在全局级别配置,以便只实例化一次,从而节省资源。