Filebeat - Logstash - 多个配置文件 - 重复数据

Filebeat - Logstash - Multiple Config Files - Duplicate data

我是 logstash 和 filebeat 的新手。我正在尝试为我的 logstash 实例设置多个配置文件。 使用 filebeat 将数据发送到 logstash。即使我为两个 logstash 配置文件创建了过滤器,我也会得到重复的数据。

Logstash 配置文件 - 1:

input {
  beats {
    port => 5045
  }
}

filter {
   if [fields][env] == "prod" {
     grok {   match => { "message" => "%{LOGLEVEL:loglevel}] %{GREEDYDATA:message}$" }
     overwrite => [ "message" ]
     }
   }
}

output {
  stdout {
    codec => rubydebug
  }

  elasticsearch {
    hosts => ["https://172.17.0.2:9200"]
    index => "logstash-myapp-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "password"
    ssl => true
    cacert => "/usr/share/logstash/certs/http_ca.crt"
  }
}

logstash 配置文件-2[=​​14=]

input {
  beats {
    port => 5044
  }
}

filter {
   if [fields][env] == "dev" {
     grok {   match => { "message" => "%{LOGLEVEL:loglevel}] %{GREEDYDATA:message}$" }
     overwrite => [ "message" ]
     }
   }
}

output {
  stdout {
    codec => rubydebug
  }

  elasticsearch {
    hosts => ["https://172.17.0.2:9200"]
    index => "logstash-myapp-%{+YYYY.MM.dd}"
    user => "elastic"
    password => "password"
    ssl => true
    cacert => "/usr/share/logstash/certs/http_ca.crt"
  }
}

日志文件内容:

[INFO] First Line
[INFO] Second Line
[INFO] Third Line

Filebeat 配置:

filebeat.inputs:
- type: filestream
  enabled: true
  paths:
    - /root/data/logs/*.log
  fields:
    app: test
    env: dev

output.logstash:
  # The Logstash hosts
    hosts: ["172.17.0.4:5044"]

我知道即使我们有多个配置文件,logstash 也会根据所有配置文件中存在的所有过滤器处理每一行数据。因此,我们在“fields.env”的每个配置文件中放置了过滤器。 我期望将 3 行发送到 Elasticsearch,因为“fields.env”是“dev”,但它向 Elasticsearch 发送了 6 行和重复数据。 请帮忙。

问题是您的两个配置文件合并了,不仅是过滤器,还有输出。

因此,通过任何输入进入管道的每条日志行都将通过所有过滤器(具有以下任何条件当然)和所有输出(输出中没有可能的条件)。

所以来自端口 5044 的第一行日志行 [INFO] First Line 只会通过 [fields][env] == "dev" 保护的过滤器,但随后会通过两个输出中的每一个,因此它结束的原因在你的 ES 中上升两次。

所以简单的解决方案是从其中一个配置文件中删除输出部分,以便日志行仅通过一个输出。

更好的解决方案是创建 separate pipelines