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

时间:2015-04-20 08:14:03

标签: elasticsearch logstash logstash-grok kibana-4

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确定Elasticsearch的类型。

OR - 如何将具有适当类型的字段发送到ElasticSearch。

由于

2 个答案:

答案 0 :(得分:1)

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

请参阅Grok Basics下的grok filter documentation

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

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

相关:

答案 1 :(得分:0)

您可以尝试使用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 }
}

如果你有另一种需要转换的类型,你可以尝试找到ruby api来转换它们。希望这可以帮到你。