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。
我是 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。