Преобразование типов данных с помощью logstash grok

Basic - это поле с плавающей запятой. Указанный индекс отсутствует в elasticsearch. При запуске файла конфигурации с logstash -f я не получаю исключения. Тем не менее, данные, отраженные и введенные в elasticsearch, показывают отображение Basic как string. Как мне это исправить? И как мне сделать это для нескольких полей?

input {  
      file {
          path => "/home/sagnik/work/logstash-1.4.2/bin/promosms_dec15.csv"
          type => "promosms_dec15"
          start_position => "beginning"
          sincedb_path => "/dev/null"
      }
}
filter {
    grok{
        match => [
            "Basic", " %{NUMBER:Basic:float}"
        ]
    }

    csv {
        columns => ["Generation_Date","Basic"]
        separator => ","
    }  
    ruby {
          code => "event['Generation_Date'] = Date.parse(event['Generation_Date']);"
    }

}
output {  
    elasticsearch { 
        action => "index"
        host => "localhost"
        index => "promosms-%{+dd.MM.YYYY}"
        workers => 1
    }
}

person Sagnik Sinha    schedule 18.12.2014    source источник
comment
Если ваш CSV-файл действительно состоит только из двух столбцов, вы можете {} разобраться с ним самостоятельно, тогда уловка% {NUMBER: Basic: float} будет работать нормально.   -  person Alain Collins    schedule 19.12.2014


Ответы (1)


У вас две проблемы. Во-первых, ваш фильтр Grok указан перед фильтром csv, и поскольку фильтры применяются в таком порядке, при применении фильтра Grok не будет поля «Базовое» для преобразования.

Во-вторых, если вы явно не разрешите это, Grok не перезапишет существующие поля. Другими словами,

grok{
    match => [
        "Basic", " %{NUMBER:Basic:float}"
    ]
}

всегда будет запретным. Укажите overwrite => ["Basic"] или, желательно, используйте функцию преобразования типа mutate:

mutate {
    convert => ["Basic", "float"]
}
person Magnus Bäck    schedule 18.12.2014