当前位置: 首页 > 知识库问答 >
问题:

如何将自定义接收管道与docker自动发现一起使用

郝修为
2023-03-14

我很难用Filebeat的Docker自动发现功能来使用定制的Elasticsearch摄取管道。我已经在我的< code>filebeat.yml文件中开始使用自定义处理器,但是我更愿意将它转移到我创建的自定义摄取管道。

首先,这是我使用自定义处理器的配置,它为我的Servarr应用Docker容器提供自定义的类似grok的处理(通过在我的docker-compose.yml文件中对它们应用标签来识别)。处理器将“消息”字段复制为“log.original”,使用剖析提取“log.level”、“log.logger”并覆盖“消息”。最后一个处理器是一个JavaScript函数,用于将log.level转换为小写(也许有点夸张,但幽默我)。

Filebeat配置:

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: true
    reload.period: 60s

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

processors:
  - if:
      equals:
        docker.container.labels.co_elastic_logs/custom_processor: servarr
    then:
      - copy_fields:
          fields:
            - from: message
              to: log.original
          fail_on_error: false
          ignore_missing: true
      - dissect:
          tokenizer: "[%{log.level}] %{log.logger}: %{message}"
          field: message
          target_prefix: ""
          overwrite_keys: true
          ignore_failure: true
      - script:
          lang: javascript
          id: lowercase
          source: >
            function process(event) {
                var level = event.Get("log.level");
                if(level != null) {
                    event.Put("log.level", level.toString().toLowerCase());
                }
            }

output.elasticsearch:
  hosts: 'elasticsearch:9200'
  username: 'elastic'
  password: '*************'

setup.kibana.host: 'kibana:5601'

logging.json: true
logging.metrics.enabled: false

docker-compose.yml文件摘录...

  lidarr:
    image: ghcr.io/linuxserver/lidarr:latest
    container_name: lidarr
    labels:
      co.elastic.logs/custom_processor: "servarr"

和一个示例日志行(在 json 中):

{"log":"[Info] DownloadDecisionMaker: Processing 100 releases \n","stream":"stdout","time":"2021-08-07T10:10:49.125702754Z"}

这很有效,并且实现了我提取字段的目标,但理想情况下,我想使用Elasticsearch的(更强大的)摄取管道,并使用更干净的filebeat.yml,所以我创建了一个有效的摄取管道“filebeat-7.13.4-servarr-stdout-pipeline”,就像这样(忽略目前,这只做grokking的事实):

[
  {
    "grok": {
      "field": "message",
      "patterns": [
        "\\[%{LOGLEVEL:log.level}\\] %{WORD:log.logger}: %{GREEDYDATA:message}"
      ],
      "trace_match": true,
      "ignore_missing": true
    }
  }
]

我针对现有文档测试了管道(我应该指出,不是那些应用了我的自定义处理的文档)。该管道适用于我在Kibana界面中测试过的所有文档。

因此,现在我来转移我的Filebeat配置,将这个管道用于带有custom_processor标签的容器。这是<code>文件节拍。yml我提出的,这显然是有效的,在大多数情况下有效,但不适用于摸索:

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: true
    reload.period: 60s

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true
      json.keys_under_root: true
      appenders:
        - type: config
          condition.equals:
            docker.container.labels.co_elastic_logs/custom_processor: servarr
          config:
            pipeline: filebeat-7.13.4-servarr-stdout-pipeline

output.elasticsearch:
  hosts: 'elasticsearch:9200'
  username: 'elastic'
  password: '*************'

setup.kibana.host: 'kibana:5601'

logging.json: true
logging.metrics.enabled: false

如果我将Filebeat的内置模块用于其他容器(如nginx),通过使用标签(如下面的示例),将使用内置模块管道:

  nginx-repo:
    image: nginx:latest
    container_name: nginx-repo
    mem_limit: 2048m
    environment:
      - VIRTUAL_HOST=repo.***.***.***,repo
      - VIRTUAL_PORT=80
      - HTTPS_METHOD=noredirect
    networks:
      - default
      - proxy
    labels:
      co.elastic.logs/module: "nginx"
      co.elastic.logs/fileset.stdout: "access"
      co.elastic.logs/fileset.stderr: "error"

我到底做错了什么?日志仍然在Elasticsearch和Kibana中结束,并被处理,但是我的grok没有被应用,没有创建新的字段,并且“message”字段没有改变。

编辑:针对链接到弹性论坛上的一篇帖子的评论之一,该评论建议路径和管道都需要明确,我尝试了以下filebeat.yml自动发现摘录,它也不起作用(但显然是有效的配置):

filebeat.autodiscover:
  providers:
    - type: docker
      hints.enabled: true
      json.keys_under_root: true
      appenders:
        - type: config
          condition:
            equals:
              docker.container.labels.co_elastic_logs/custom_processor: "servarr"
          config:
            - type: docker
              containers:
                ids:
                  - "${data.docker.container.id}"
                stream: all
              paths:
                - /var/lib/docker/containers/${data.docker.container.id}/${data.docker.container.id}-json.log
              pipeline: filebeat-7.13.4-servarr-stdout-pipeline

我尝试使用带引号和不带引号的< code > docker . container . labels . co _ elastic _ logs/custom _ processor 值。我也有同样的行为,日志在Elasticsearch / Kibana中结束,但是它们被处理得好像跳过了我的摄取管道。

共有1个答案

鲜于渊
2023-03-14

我们在Filebeat中使用Kubernetes而不是Docker,但也许我们的配置仍然可以帮助你。

我们启用了自动发现功能,并将所有pod日志发送到公共摄取管道,但使用Redis模块并通过两个自定义摄取管道之一将其日志发送到Elasticsearch的任何Redis pod的日志除外,这取决于它们是普通Redis日志还是slowlog Redis日志,这在以下块中配置:

所有其他检测到的 Pod 日志将使用以下“输出”部分中的 catch-all 配置发送到通用摄取管道:

我们要做的其他事情是使用“set”处理器将摄取管道的名称添加到摄取的文档中:

事实证明,在 Kibana 中查看事件文档时,在诊断管道是否实际执行时,这非常有用。

 类似资料:
  • 如何将自定义摄取管道与Filebeat模块一起使用?在我的例子中,我使用的是<code>apache<code>模块。 根据多个来源,这应该可以通过<code>output.elasticsearch进行配置。管道/。资料来源如下: https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html#pi

  • 问题内容: 我知道Android 很棒。它使我们能够播放本地文件以及媒体流。而且非常容易使用(例如): 通过调用具有不同参数集的重载,可以设置不同类型的DataSource 。这个函数有一个有趣的原型: 看起来可以用自己的实现完全覆盖。它确实有效: 并在主要代码中: 是的,这很好。但是,如果我尝试音频/ aacp广播流(例如:“ http://111.223.51.8:8005”-它是“ COOL

  • 问题内容: 我只是开始看一下Mattt出色的新Alamofire快速联网库,并且不确定如何将其与自定义标头一起使用。 我正在尝试从AFNetworking转换为Alamofire的代码是这样的: 问题答案: 根据官方文档,不建议修改会话配置: 不建议将其用于Authorization或Content- Type标头。而是分别使用URLRequestConvertible和ParameterEnco

  • 使装饰器包含具有name属性的管道元数据。 此值将用于在模板表达式中调用此管道。 它必须是有效的JavaScript标识符。 实现PipeTransform接口的transform方法。 此方法接受管道的值和任何类型的可变数量的参数,并返回一个变换的(“管道”)值。 import { Component } from '@angular/core'; selector: 'app-root',

  • 我正在将我的Spring应用程序从Spring-boot 1.5.9迁移到Spring-boot 2.0.0。使用这个新的Spring包,我在Redis中缓存数据时遇到了一些问题。 在我的配置中,我有3个具有不同TTL(长、中、短)的CacheManager: 我还有一个自定义RestTemplate: 在上一个Spring版本中,缓存的每个数据都使用这个RestTemplate,并使用Gener

  • 问题内容: 我无法让spring-data-elasticsearch适用于Elasticsearch 2.0+版本。 关于使用以下POM 并添加自定义的ElasticsearchConfiguration 在 Application.java* 下面 * 在有效的POM中,我仍然收到elasticsearch 1.5.2(以及附加的2.0.1.RELEASE版本)作为依赖项。 在运行应用程序时收