elasticsearch 如何在不从输入获取的情况下填充Logstash输出变量?,elasticsearch,logstash,elasticsearch,Logstash" /> elasticsearch 如何在不从输入获取的情况下填充Logstash输出变量?,elasticsearch,logstash,elasticsearch,Logstash" />

elasticsearch 如何在不从输入获取的情况下填充Logstash输出变量?

elasticsearch 如何在不从输入获取的情况下填充Logstash输出变量?,elasticsearch,logstash,elasticsearch,Logstash,有没有另一种方法可以告诉Logstash向输出变量提供一个值,而无需从Logstash输入中提取该值?例如,在我的例子中,我想基于一个性能运行ID创建一个Elasticsearch索引,这是我从外部脚本执行的,然后让Logstash发送给它。目前,我正在考虑创建一个tcp输入,只用于接收性能运行信息,然后在运行id上匹配一个过滤器。不过,这似乎是一种复杂的方法。例如: input { tcp { type => "perfinfo" port =&g

有没有另一种方法可以告诉Logstash向输出变量提供一个值,而无需从Logstash输入中提取该值?例如,在我的例子中,我想基于一个性能运行ID创建一个Elasticsearch索引,这是我从外部脚本执行的,然后让Logstash发送给它。目前,我正在考虑创建一个tcp输入,只用于接收性能运行信息,然后在运行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。我已经读到了

更新

谢谢你。使用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,请参阅上面我的更新。此后,我还尝试添加一个字段并使用该字段作为变量,但仍然存在一个问题,即它会创建两个索引。一个索引具有未计算的变量名,另一个索引具有变量值。不知道它为什么这样做。