Интерпретировать местоположения из файла JSON Keen.io в фильтре logstash

Я пытаюсь разобрать файл JSON из Keen.io с помощью logstash в elasticsearch. Местоположение и временная метка хранятся в таких параметрах:

{
  "result":
  [
    {
      "keen":
      {
        "timestamp": "2014-12-02T12:23:51.000Z",
        "created_at": "2014-12-01T23:25:31.396Z",
        "id": "XXXX",
        "location":
        {
          "coordinates": [-95.8, 36.1]
        }
      }
    }
  ]
}

Мой фильтр в настоящее время выглядит так:

input {
  file {
    path => ["test.json"]
    start_position => beginning
    type => json
  }
}

filter {
  json {
    source => message
    remove_field => message
  }
}

output {
  stdout { codec => rubydebug }
}

Как я могу проанализировать поля «отметка времени» и «местоположение», чтобы они использовались для @timestamp и @geoip.coordinates в Elasticsearch?

Обновление: я пробовал варианты этого без везения. Документация очень простая - я неправильно понимаю, как ссылаться на поля JSON? Есть ли способ добавить вывод отладки, чтобы помочь? Я попробовал Как отладить плагин файла logstash и Вывести строку на стандартный вывод с помощью Logstash 1.4?, но ни то, ни другое не работает.

filter {
  json {
    source => message
    remove_field => message
  }
  if ("[result][0][keen][created_at]") {
    date {
      add_field => [ "[timestamp]", "[result][0][keen][created_at]" ]
      remove_field => "[result][0][keen][created_at]"
    }
  }

Обновление 2:

Дата работает сейчас, все еще нужно, чтобы работало местоположение.

filter {
  json {
    source => message
    remove_field => message
    add_tag => ["valid_json"]
  }
  if ("valid_json") {
    if ("[result][0][keen][created_at]") {
      date {
        match => [ "[result][0][keen][created_at]", "ISO8601" ]
      }
    }
  }
}

person parsley72    schedule 22.04.2015    source источник
comment
Я не думаю, что add_field правильный, вам понадобится update_field, потому что поле метки времени уже существует. Во всяком случае, он вообще переходит в часть if (...)? Добавьте тег где-нибудь там, чтобы узнать.   -  person Ulrich Eckhardt    schedule 26.04.2015
comment
Но update_field не существует? Хорошая идея с биркой, интересно, для чего они.   -  person parsley72    schedule 26.04.2015
comment
Вам нужен атрибут match фильтра date, например filter { date { match => [ "[result][0][keen][created_at]", "MMM dd YYYY HH:mm:ss" ] } }   -  person Rafael Fonseca    schedule 26.04.2015
comment
logstash.net/docs/1.4.2/filters/mutate#update тот, который я имел в виду, он доступен только через фильтр mutate. Итак, сохраните значение во временном файле, а затем обновите его с помощью этого фильтра. Что касается тегов, я регулярно устанавливал тег, например valid_json, в фильтр json, а затем проверял этот тег, чтобы принять решение о дальнейшей обработке. Я бы также использовал ветку else, чтобы пометить эту запись в журнале как явно недействительную, так как это предполагает, что где-то есть ошибка программирования.   -  person Ulrich Eckhardt    schedule 26.04.2015


Ответы (1)


Поле «created_at» Keen.io хранится в Формат ISO 8601, поэтому его можно легко проанализировать с помощью фильтра даты. Координаты широты и долготы можно установить, скопировав существующие координаты Keen.io в массив logstash geoip.coordinates.

input {
  file {
    path => ["data.json"]
    start_position => beginning
    type => json
  }
}

filter {
  json {
    source => message
    remove_field => message
    add_tag => ["valid_json"]
  }
  if ("valid_json") {
    if ("[result][0][keen][created_at]") {
      date {
        # Set @timestamp to Keen.io's "created_at" field
        match => [ "[result][0][keen][created_at]", "ISO8601" ]
      }
    }
    if ("[result][0][keen][location][coordinates]") {
      mutate {
        # Copy existing co-orndiates into geoip.coordinates array
        add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][0]}" ]
        add_field => [ "[geoip][coordinates]", "%{[result][0][keen][location][coordinates][1]}" ]
        remove_field => "[result][0][keen][location][coordinates]"
      }
    }
  }
}

output {
  stdout { codec => rubydebug }
}
person parsley72    schedule 27.04.2015