0

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 被索引为日期类型,number_1 被索引为弹性搜索中的数字类型。

PS:有可能吗??从 Logstash 中确定 Type of Elasticsearch 字段。

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

谢谢

4

2 回答 2

1

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

请参阅Grok 基础知识下的grok 过滤器文档。

另一种选择是使用mutate 过滤器来转换现有字段的类型:

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

有关的:

于 2015-04-20T08:31:48.040 回答
0

您可以尝试使用ruby插件转换所有字段。在此示例中,我们将time_1anddate_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 }
}

如果您有其他类型需要转换,您可以尝试找到 ruby​​ api 来转换它们。希望这可以帮到你。

于 2015-04-20T11:49:53.103 回答