如何将自定义摄取管道与坞站自动发现结合使用 [英] How to use custom ingest pipelines with docker autodiscover

查看:22
本文介绍了如何将自定义摄取管道与坞站自动发现结合使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很难将定制的Elasticearch接收管道与FileBeat的Docker自动发现结合使用。我从filebeat.yml文件中的自定义处理器开始,但我更愿意将其转换为我创建的自定义接收管道。

首先,以下是我使用定制处理器的配置,该处理器为我的Servarrapp Docker容器(通过在我的docker-compose.yml文件中为它们应用标签来标识)提供定制的类似Grok的处理。处理器将‘Message’字段复制到‘log.Origal’,使用DISCECT提取‘log.Level’、‘log.logger’并覆盖‘Message’。最终的处理器是一个用于将log.Level转换为小写的JavaScript函数(可能有些夸张,但可以幽默一下)。

文件节拍配置:

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 
","stream":"stdout","time":"2021-08-07T10:10:49.125702754Z"}

这工作得很好,实现了我提取字段的目标,但理想情况下,我希望使用Elasticearch(更强大)的摄取管道,并与更干净的filebeat.yml共存,所以我创建了一个工作的摄取管道";filebeat-7.13.4-servarr-stdout-pipeline";,如下所示(忽略这样一个事实,目前,这只做了摸索):

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

我针对现有文档(我应该注意的是,没有应用了我的定制处理的文档)测试了管道。管道与我在Kibana界面中测试过的所有文档都一致。

因此,现在我要转换我的Filebeat配置,以便将此管道用于带有CUSTOMPROCER标签的容器。这是我想出的filebeat.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"

我在这里做错了什么?日志仍然在Elasticearch和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

我尝试使用带引号和未带引号的docker.container.labels.co_elastic_logs/custom_processor值。我的行为与日志最终到达Elasticearch/Kibana的行为相同,但它们被处理时就像跳过了我的接收管道一样。

推荐答案

我们使用的是Kubernetes而不是Docker with FileBeat,但我们的配置可能仍能帮助您解决问题。

我们启用了自动发现,并将所有Pod日志发送到一个公共接收管道除外,对于来自任何使用Redis模块的Redis Pod的日志,并根据它们是普通Redis日志还是慢日志Redis日志,通过两个自定义接收管道之一将其日志发送到Elasticearch,这在以下块中配置:

检测到的所有其他Pod日志将使用输出部分中的以下全部捕获配置发送到公共接收管道:

我们要做的其他事情是使用";set";处理器将接收管道的名称添加到接收的文档:

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

这篇关于如何将自定义摄取管道与坞站自动发现结合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆