我已经读过可以像这样为索引分配动态名称:
elasticsearch {
cluster => "logstash"
index => "logstash-%{clientid}-%{+YYYY.MM.dd}"
}
我想知道的是,是否可以动态分配模板:
elasticsearch {
cluster => "logstash"
template => "/etc/logstash/conf.d/%{clientid}-template.json"
}
变量%{clientid}来自哪里?
谢谢!
答案 0 :(得分:3)
完全披露:我是Elastic的Logstash开发人员
您无法动态分配模板,因为模板仅在Logstash初始化时上载一次。如果没有流量,确定性变量就不会完成。由于在初始化期间没有交通流量,因此没有什么可以填补空白" %{clientid}
。
同样重要的是要记住Elasticsearch索引模板仅在创建新索引时使用,因此每次文档到达Logstash中的Elasticsearch输出块时都不会上载模板 - 你能想象多少如果Logstash必须这样做会更慢吗?如果您打算拥有多个模板,则需要在将任何数据发送到Elasticsearch之前将其上载到Elasticsearch。您可以使用curl和Elasticsearch API调用自己制作的脚本来完成此操作。这也允许您更新模板而无需重新启动Logstash。您可以在索引翻转之前的任何时间运行脚本,并且在创建新索引时,他们将拥有新的模板设置。
Logstash可以将数据发送到动态配置的索引名称,就像您上面一样。如果没有模板存在,Elasticsearch将创建最佳猜测映射,而不是您想要的。模板可以而且应该完全独立于Logstash。添加此功能是为了为全新用户提供改进的开箱即用体验。对于高级用例,默认模板不太理想,如果您有多个索引模板,Logstash不是模板管理的好工具。
答案 1 :(得分:2)
经过一些测试和其他用户的反馈,感谢Ben Lim,到目前为止似乎无法做到这一点。 最接近的是做这样的事情:
if [type] == "redis-input" {
elasticsearch {
cluster => "logstash"
index => "%{type}-logstash-%{+YYYY.MM.dd}"
template => "/etc/logstash/conf.d/elasticsearch-template.json"
template_name => "redis"
}
} else if [type] == "syslog" {
elasticsearch {
cluster => "logstash"
index => "%{type}-logstash-%{+YYYY.MM.dd}"
template => "/etc/logstash/conf.d/syslog-template.json"
template_name => "syslog"
}
}