如何设置Logstash配置目标索引?

时间:2018-02-12 13:58:47

标签: json elasticsearch logstash

我正在尝试通过文档字段在Logstash配置文件中动态设置目标elasticsearch索引。不幸的是,似乎logstash并没有将其解释为变量,而是字符串

它设法创建了许多新索引,因为我一直在尝试访问文档中的索引名称。

enter image description here

大致总结了我的尝试。这是我输出到文件中的示例消息:

{  
"tags":[],
"type":"logstash",
"stack_info":null,
"level":"INFO",
"@timestamp":"2018-02-12T13:30:34.332Z",
"@version":"1",
"host":"Michals-MacBook-Pro.local",
"logger_name":"python-logstash-logger",
"message":"{
    \"index_name\": \"THIS_IS_MY_INDEX_NAME\"
    }",
"path":"/Users/michalfasanek/..."
}

这是我目前的配置文件:

input { 
    udp { 
            port => 5959 
            codec => json  
    } 
} 

filter {

}

output {


    elasticsearch { 

            hosts => "localhost:9200"
            index => "[message][index_name]"
    }

    file {
            path => "/usr/local/Cellar/logstash/6.2.0/controloutputnay"
    }

    stdout { }
}

如何将其称为变量而不是字符串?感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

我自己解决了这个问题,但并不是我想要的方式。我在用于生成文档的Python记录器中发现了“额外”参数。

https://pypi.python.org/pypi/python-logstash

这个“额外”是添加到JSON顶级的字段,这意味着我不必处理'index_name'字段嵌套在'message'字段中。

在此之后,我的配置行只是

index => "%{index_name}"

虽然这对我来说非常合适,包括在使用它之后不必过滤掉'index_name'字段,但我仍然想知道为什么它首先不起作用。欢迎任何建议。

答案 1 :(得分:1)

logstash事件中的message字段是一个字符串,因此您必须从index_name字符串字段中将message提取到另一个字段中,然后将其用于你的elasticsearch输出插件。

您可以使用grok过滤器插件执行此操作:

grok { 
 match => ["message", "\"index_name\": \"%{WORD:index_name}\""] 
}

此过滤器将创建一个名为index_name的字段。然后你可以在输出中使用它:

elasticsearch { 
   hosts => "localhost:9200"
   index => "%{index_name}"
}