如何填充Logstash输出变量而不从输入中获取它?

时间:2014-10-17 17:38:58

标签: elasticsearch logstash

还有另一种方法可以告诉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。

2 个答案:

答案 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,这通常发生在性能运行之间。这种方法更容易做,而且看起来更干净。