如何在 Logstash 中设置 Elasticsearch 输出模板

How to set an Elasticsearch output template in Logstash

我对 Kibana 和 ELK(Elasticsearch、Logstash 和 Kibana)堆栈比较陌生,我在设置方面做得很好,但我 运行 进入我认为奇怪的地方问题,需要一些帮助来了解发生了什么。

我正在使用 ELK 堆栈来 c运行ch 一些 Apache 日志,但我有自己的自定义类型设置。所以我需要明确指定字段类型等,而不是让 Logstash(或者是 Kibana?)猜测数据映射是什么。

reading the Logstash documentation 开始,很明显我可以在此处显示的 output.elasticsearch 配置块中设置 template 值:

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "logstash-apache"
    document_id => "%{[@metadata][fingerprint]}"
    manage_template => false
    template => "/path/to/logstash/logstash-apache.json"
    template_name => "logstash-apache"
    template_overwrite => true
  }
  stdout {
    codec => rubydebug
  }
}

100% 确定我设置了正确的路径。但出于某种原因,如果我使用它,启动 Logstash 并让它做它的事情,我在 logstash-apache.json 中指定的映射不会显示。 Kibana 中的索引也是 logstash-apache 所以这应该可以正常工作吗?

所以我现在要做的是像这样将映射模板直接预加载到 Elasticsearch 中:

curl -ss -XPUT "http://localhost:9200/_template/logstash-apache/" -H 'Content-Type: application/json' -d @"/path/to/logstash/logstash-apache.json";

而且它显然运行良好并且数据得到了正确的映射……但是做这样的事情相当笨拙。如果全部来自我设置的 logstash-apache.conf 文件会更干净。

那我做错了什么?我该怎么做才能通过 logstash-apache.conf 使用我的自定义映射模板,而不必跳过 curl 命令的额外环节?

问题是您已将 manage_template 设置为 false,这完全禁用了此模板创建功能,需要您像现在一样手动创建模板。

所以您的 output 部分应该看起来像这样,您应该可以开始了:

  elasticsearch {
    hosts => ["localhost:9200"]
    index => "logstash-apache"
    document_id => "%{[@metadata][fingerprint]}"
    manage_template => true                              <-- change this line
    template => "/path/to/logstash/logstash-apache.json"
    template_name => "logstash-apache"
    template_overwrite => true
  }