Logstash动态分配模板

时间:2014-11-03 23:03:18

标签: logstash

我已经读过可以像这样为索引分配动态名称:

elasticsearch {
            cluster => "logstash"
            index => "logstash-%{clientid}-%{+YYYY.MM.dd}"
    }

我想知道的是,是否可以动态分配模板:

elasticsearch {
            cluster => "logstash"
            template => "/etc/logstash/conf.d/%{clientid}-template.json"
    }

变量%{clientid}来自哪里?

谢谢!

2 个答案:

答案 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"
            }
    }