我正在尝试通过文档字段在Logstash配置文件中动态设置目标elasticsearch索引。不幸的是,似乎logstash并没有将其解释为变量,而是字符串。
它设法创建了许多新索引,因为我一直在尝试访问文档中的索引名称。
大致总结了我的尝试。这是我输出到文件中的示例消息:
{
"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 { }
}
如何将其称为变量而不是字符串?感谢您的任何建议。
答案 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}"
}