这是我的logstash.conf
:
input {
http {
host => "127.0.0.1"
port => 31311
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
}
stdout {
codec => "rubydebug"
}
}
作为测试,我在PowerShell中运行了以下命令:
C:\ Users \ Me \ Downloads \ curl-7.64.1-win64-mingw \ bin>。\ curl.exe -XPUT 'http://127.0.0.1:31311/twitter'
以下输出显示在我的Logstash
终端内:
{
"@timestamp" => 2019-04-09T08:32:09.250Z,
"message" => "",
"@version" => "1",
"headers" => {
"request_path" => "/twitter",
"http_version" => "HTTP/1.1",
"http_user_agent" => "curl/7.64.1",
"request_method" => "PUT",
"http_accept" => "*/*",
"content_length" => "0",
"http_host" => "127.0.0.1:31311"
},
"host" => "127.0.0.1"
}
然后我跑步
C:\ Users \ Me \ Downloads \ curl-7.64.1-win64-mingw \ bin>。\ curl.exe -XGET “ http://127.0.0.1:9200/_cat/indices”
在PowerShell中,我看到了
yellow open logstash-2019.04.09 1THStdPfQySWl1WPNeiwPQ 5 1 0 0 401b 401b
在ElasticSearch convention之后,响应我的logstash-2019.04.09
请求,创建了一个名为PUT
的索引。
我的问题是:如果我希望索引具有与在命令{index_name}
中传递的.\curl.exe -XPUT 'http://127.0.0.1:31311/{index_name}'
参数相同的值,我该如何在{{1}中配置ElasticSearch输出}文件?
编辑:澄清一下,我希望logstash.conf
每次发出创建新索引的请求时都可以动态读取。那有可能吗?
答案 0 :(得分:1)
index output configuration option可以实现。
使用%{foo}
语法可以动态配置。由于您希望[headers][request_path]
的值位于索引配置中,因此可以执行以下操作:
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[headers][request_path]}"
}
}
要使其正常工作,值[headers][request_path]
字段不得包含以下任何字符:[ , \", *, \\, <, |, ,, >, /, ?]
。
我建议您使用gsub configuration option of the mutate filter。因此,要删除所有正斜杠,您应该具有以下内容:
filter{
mutate{
gsub => ["[headers][request_path]","/",""]
}
}
如果请求路径中有多个正斜杠,则可以将其替换为Elasticsearch可以接受的某些字符。
因此,您的最终 logstash.conf文件应如下所示:
input {
http {
host => "127.0.0.1"
port => 31311
}
}
filter{
mutate{
gsub => ["[headers][request_path]","/",""]
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "%{[headers][request_path]}"
}
stdout {
codec => "rubydebug"
}
}
答案 1 :(得分:0)
您可以通过在Elasticsearch输出部分添加一个index
配置设置来实现。例如
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "yourindexnamehere"
}
stdout {
codec => "rubydebug"
}
}