我是 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
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.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 行并重復資料。請幫忙。
uj5u.com熱心網友回復:
問題是您的兩個組態檔被合并,不僅過濾器而且輸出。
因此,通過任何輸入進入管道的每條日志行都將通過所有過濾器(當然具有任何條件)和所有輸出(輸出中沒有可能的條件)。
因此,從埠 5044 進入的第一條日志行將[INFO] First Line僅通過由 保護的過濾器[fields][env] == "dev",但隨后將通過兩個輸出中的每一個,因此它在您的 ES 中結束了兩次。
因此,簡單的解決方案是從一個組態檔中洗掉輸出部分,以便日志行僅通過單個輸出。
更好的解決方案是創建單獨的管道。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/416984.html
標籤:
