还有另一种方法可以告诉Logstash为输出变量提供值而不从Logstash输入中提取它吗?例如,在我的情况下,我想基于性能运行ID(我从外部脚本执行)创建一个Elasticsearch索引,然后让Logstash发送给它。现在我想创建一个tcp输入只是为了接收perf运行信息,然后有一个过滤器匹配运行id。虽然这似乎是一种令人费解的方式。例如:
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。我已经读过它了。
更新
感谢Nirdesh。使用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。
答案 0 :(得分:4)
是强>
你可以添加任何号码。你自己的变量对于中间结果或永久使用名为add_field
的属性。 logstash中的所有大多数过滤器都支持此属性。
因此,对于您的解决方案,您可以使用ruby脚本动态查找id并将其存储在名为id
的新变量中,您可以在output
中使用它。
例如:
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"
}
}
答案 1 :(得分:0)
我不确定我能通过Logstash做我想做的事情。为了更清楚,我只想根据执行的性能运行ID更改索引。数据中没有任何内容可以提供此信息(我必须将其从数据库中提取)。因此,我没有尝试让Logstash监听性能运行ID,而是在外部编写脚本。该脚本使用Elasticsearch API创建新索引,然后在Logstash配置文件中为索引执行字符串替换。然后它重新启动Logstash,这通常发生在性能运行之间。这种方法更容易做,而且看起来更干净。