Logstash:将offset用作document_id

时间:2017-04-11 05:29:14

标签: elasticsearch logstash filebeat kibana-5

我有以下设置:

  

FileBeat - > Logstash - > Elasticsearch - > Kibana(全部5.1.1)

当我将日志文件(JSON)推入Filebeat时,如果我尝试在Kibana界面中看到它,则会添加相同的日志3-4次(重复)。 检查FileBeat日志后,我发现可能是因为Filebeat没有收到已发送日志的确认,因此它会继续重新发送。 停止接收重复文件我想我必须在logstash配置文件中使用document_id

output
{ 
    elasticsearch { 
        document_id => "%{offset}"
        index => "ap-index"
        hosts => ["localhost:9222"]
    }
}

我的问题是,每个文档的偏移字段是唯一的吗? 这是否是停止接收重复的正确方法?

1 个答案:

答案 0 :(得分:1)

如果Filebeat没有收到Logstash的确认,这是一个标志或问题,您应该首先找到根本原因(管道中可能存在拥塞)。

如果您有多个日志文件或执行任何日志轮换,则偏移量不是唯一的。如果您的日志消息包含时间戳,那么我建议使用指纹过滤器来生成消息的散列。然后使用指纹哈希作为Elasticsearch中的文档ID。

input {
  beats {
    port => 5044
  }
}

filter {
  fingerprint {
    method => "SHA1"
    key    => "some_random_hmac_key"
    source => ["[beat][hostname]", "offset", "message"]
    concatenate_sources => true
    target => "[@metadata][id]"
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
    document_id =>"%{[@metadata][id]}"
  }
}