elasticsearch 如何在不从输入获取的情况下填充Logstash输出变量?
有没有另一种方法可以告诉Logstash向输出变量提供一个值,而无需从Logstash输入中提取该值?例如,在我的例子中,我想基于一个性能运行ID创建一个Elasticsearch索引,这是我从外部脚本执行的,然后让Logstash发送给它。目前,我正在考虑创建一个tcp输入,只用于接收性能运行信息,然后在运行id上匹配一个过滤器。不过,这似乎是一种复杂的方法。例如:elasticsearch 如何在不从输入获取的情况下填充Logstash输出变量?,elasticsearch,logstash,elasticsearch,Logstash,有没有另一种方法可以告诉Logstash向输出变量提供一个值,而无需从Logstash输入中提取该值?例如,在我的例子中,我想基于一个性能运行ID创建一个Elasticsearch索引,这是我从外部脚本执行的,然后让Logstash发送给它。目前,我正在考虑创建一个tcp输入,只用于接收性能运行信息,然后在运行id上匹配一个过滤器。不过,这似乎是一种复杂的方法。例如: input { tcp { type => "perfinfo" port =&g
input {
tcp {
type => "perfinfo"
port => 8888
}
}
if [type] == "perfinfo" {
do some matching to extract the id
}
output {
elasticsearch {
cluster => "mycluster"
manage_template => false
index => "%{id}-perftest"
}
}
我不确定是否需要将manage_template设置为false。我已经读到了
更新
谢谢你。使用Ruby可能非常方便
当我等待时,我尝试使用grok过滤器,如下所示:
grok {
match => { "message" => "%{WORD:perftype}-%{POSINT:perfid}" }
}
调试期间生成此标准输出的:
{
"message" => "awperf-14",
"@version" => "1",
"@timestamp" => "2014-10-17T20:01:19.758Z",
"host" => "0:0:0:0:0:0:0:1:33361",
"type" => "perfinfo",
"perftype" => "awperf",
"perfid" => "14"
}
我试着创建一个基于此的索引,如下所示:
index => "%{perftype}-%{perfid}"
因此,当我将'awperf-14'传递给输入时,我最终创建了这些索引
%{perftype}-%{perfid}
awperf-14
这不是我所期望的。另外,开始填充的是%{perftype}-%{perfid}索引,而不是我真正想要的awperf-14。是的
您可以使用名为add_field的属性为中间结果或永久结果添加任意数量的变量。logstash中的所有筛选器都支持此属性
因此,对于您的解决方案,您可以使用ruby脚本动态查找id,并将其存储在名为id的新变量中,您可以在输出中使用它
例如:
input {
tcp {
type => "perfinfo"
port => 8888
}
}
filter{
if [type] == "perfinfo" {
ruby{
//do some processing
add_field => { "id" => "Some value" }
}
}
}
output {
elasticsearch {
cluster => "mycluster"
manage_template => false
index => "%{id}-perftest"
}
}
我不确定我能通过Logstash做我想做的事。更清楚地说,我只是想根据我正在执行的性能运行ID更改索引。数据中没有任何信息,我必须从数据库中提取。因此,我没有尝试让Logstash侦听性能运行ID,而是在外部编写了脚本。该脚本使用ElasticSearchAPI创建一个新索引,然后在Logstash配置文件中对该索引进行字符串替换。然后它重新启动Logstash,这通常发生在性能运行之间。这种方法更容易做到,而且看起来更干净 嗨,Nirdesh,请参阅上面我的更新。此后,我还尝试添加一个字段并使用该字段作为变量,但仍然存在一个问题,即它会创建两个索引。一个索引具有未计算的变量名,另一个索引具有变量值。不知道它为什么这样做。