【问题标题】:Logstash/Elasticsearch CSV Field Types, Date Formats and Multifields (.raw)Logstash/Elasticsearch CSV 字段类型、日期格式和多字段 (.raw)
【发布时间】:2015-03-02 05:02:48
【问题描述】:

我一直在尝试使用 Logstash 中的 CSV 过滤器将制表符分隔的文件导入 Elasticsearch。获取数据实际上非常容易,但是当我在 Kibana 中查看数据时,我无法正确输入字段类型。日期和整数继续以字符串形式出现,因此我无法按日期绘制或对整数(总和、平均值等)进行任何分析。

我在获取要填充的字段的 .raw 版本时也遇到了麻烦。例如,在设备中我有“HTC One”之类的数据,但是如果我在 Kibana 中制作饼图,它会显示为两个单独的分组“HTC”和“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"}
        }
    }
}

【问题讨论】:

    标签: elasticsearch logstash kibana


    【解决方案1】:

    想通了 - 模板名称就是索引。所以 "template" : "event" 行应该是 "template" : "userid"

    【讨论】:

    • 模板根目录下的“template”属性实际上是一个模式,因此“user*”会匹配任何以“user”开头的索引。当您将模板发布到 elasticsearch 时,会给出模板的名称。文档:elasticsearch.org/guide/en/elasticsearch/reference/current/…
    • @econgineer 我也(未成功)尝试将 csv 过滤器的列转换为某些类型,例如而不是字符串到整数。你也有运气吗?
    • @markus,就像我说的那样,一旦我确保“模板”属性被标记为与我在 logstash.conf 文件中定义的索引名称相同,上述方法就起作用了。
    【解决方案2】:

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

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

    详情请查看logstash docs - mutate convert

    【讨论】:

    • csv过滤器还有一个“convert”属性,但对我不起作用。有什么想法吗,@markus?
    • @DmitriLikhachev 抱歉,我还没用过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多