使用ElasticSearch输出

时间:2019-04-09 08:54:27

标签: rest elasticsearch logstash elasticsearch-plugin

这是我的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每次发出创建新索引的请求时都可以动态读取。那有可能吗?

2 个答案:

答案 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"
  }
}