Logstash/Easticsearch CSV字段类型、日期格式和多字段(.raw)



我一直在尝试使用Logstash中的CSV过滤器将制表符分隔的文件放入Elasticsearch。获取数据实际上非常容易,但当我查看Kibana中的数据时,我很难正确获取字段类型。日期和整数继续作为字符串出现,所以我不能按日期绘图,也不能对整数(sum、mean等)执行任何分析函数。

我在获取要填充的字段的.raw版本时也遇到了问题。例如,在设备中,我有类似"HTC One"的数据,但当我在Kibana中做饼图时,它会显示为两个独立的分组"HTC"one_answers"One"。当我尝试绘制device.raw的图表时,它显示为一个缺失的字段。据我所知,Logstash似乎应该自动创建每个字符串字段的原始版本,但这似乎并没有发生。

我一直在筛选文档、谷歌和堆栈,但还没有找到解决方案。任何想法都值得赞赏!谢谢

配置文件:

#logstash.conf
input {  
      file {
          path => "file.txt"
          type => "event"
          start_position => "beginning"
          sincedb_path => "/dev/null"
      }
}
filter {  
    csv {
      columns => ["userid","date","distance","device"]
      separator => "    "
    }
}
output {  
    elasticsearch {
        action => "index"
        host => "localhost"
        port => "9200"
        protocol => "http"
        index => "userid" 
        workers => 2
        template => template.json
    }
    #stdout {
    #    codec => rubydebug
    #}
}

这是模板文件:

#template.json:
{
    "template": "event",
    "settings" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 0,
        "index" : {
            "query" : { "default_field" : "userid" } 
        }
    },
    "mappings": {
        "_default_": { 
            "_all": { "enabled": false },
            "_source": { "compress": true },
            "dynamic_templates": [
                {
                    "string_template" : { 
                        "match" : "*",
                        "mapping": { "type": "string", "index": "not_analyzed" },
                        "match_mapping_type" : "string"
                     } 
                 }
             ],
             "properties" : {
                "date" : { "type" : "date", "format": "yyyy-MM-dd HH:mm:ss"},
                "device" : { "type" : "string", "fields": {"raw": {"type":  "string","index": "not_analyzed"}}},
                "distance" : { "type" : "integer"}
        }
    }
}

弄清楚了——模板名称就是索引。因此,"template":"event"行应该是"template":"userid"

我找到了另一种(更简单)的方法来指定字段的类型。您可以使用logstash的mutate过滤器来更改字段的类型。只需在您的csv过滤器之后将以下过滤器添加到您的logstash配置中

  mutate {
    convert => [ "fieldname", "integer" ]
  }

有关详细信息,请查看logstash docs-mutate convert

最新更新