使用有效类型将 Logstash 输出到 ElasticSearch

Logstash output to ElasticSearch With Valid Types

ELK Stack 已成功设置。

使用grokdebug.herokuapp.com

我的 gork 模式也有效并被转储到 ElasticSearch

filter {
  if [type] == "some_log" {
grok {
    match => { "message" => '%{WORD:word_1} %{TIME:time_1} %{DATE:date_1} %{NUMBER:number_1}'
             }
overwrite => "message"
     }
                          }
     }

输入的 grok 解析完全正确。

输出为

output {
    elasticsearch { 
         protocol => "http" 
                  }
       }

问题是所有转储变量都是字符串类型。

如何让他们在 ElasticSearch 中登录到各自的类型(正确的映射类型)

time_1、date_1 和 number_1 都具有相同类型

"time_1":{
    "type":"string",
    "norms":{
        "enabled":false
            },
     "fields":{ 
            "raw":{
                 "type":"string",
                 "index":"not_analyzed",
                 "ignore_above":256
                  }
              }
          }

我希望 date_1 在 Elastic 搜索中被索引为日期类型,number_1 被索引为数字类型。

PS: 可以吗??从 Logstash 中确定 Elasticsearch 字段的类型。

OR - 如何将那些具有正确类型的字段发送到 ElasticSearch。

谢谢

在您的 grok 模式中,使用 %{PATTERN:field:datatype} 形式将捕获的字段转换为字符串以外的内容。有效数据类型为 "int" 和 "float"。在你的情况下,你会使用 %{NUMBER:number_1:int} 将您的 number_1 字段转换为整数。

请参阅 Grok 基础知识下的 grok filter documentation

另一种选择是使用mutate filter转换现有字段的类型:

mutate {
  convert => ["name-of-field", "integer"]
}

相关:

  • Data type conversion using logstash grok
  • .

您可以尝试使用ruby插件转换所有字段。 在此示例中,我们将 time_1date_1 组合在一起并将它们转换为 Date 格式。

input {
        stdin{}
}

filter {
        grok {
                match => [ "message" , "%{WORD:word_1} %{TIME:time_1} %{DATE:date_1} %{NUMBER:number_1}"]
                        overwrite => "message"
        }
        ruby {
                code => "
                        datetime = event['time_1'] + ' ' + event['date_1']
                        event['datetime'] = Time.strptime(datetime,'%H:%M:%S %d-%m-%Y')
                        event['number_1'] = event['number_1'].to_i
                "
        }
}

output {
        stdout { codec => rubydebug }
}

如果你有其他类型需要转换,你可以尝试找rubyapi进行转换。希望这可以帮到你。