Logstash не может проиндексировать вasticsearch, потому что не может разобрать дату - PullRequest
0 голосов
/ 03 ноября 2019

Я получаю много следующих ошибок при запуске logstash для индексации документов в Elasticsearch

[2019-11-02T18:48:13,812][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"my-index-2019-09-28", :_type=>"doc", :_routing=>nil}, #<LogStash::Event:0x729fc561>], :response=>{"index"=>{"_index"=>"my-index-2019-09-28", "_type"=>"doc", "_id"=>"BhlNLm4Ba4O_5bsE_PxF", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [timestamp] of type [date] in document with id 'BhlNLm4Ba4O_5bsE_PxF'", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"Invalid format: \"2019-09-28 23:32:10.586\" is malformed at \" 23:32:10.586\""}}}}}

У него явно есть проблема с формирующейся датой, но я не вижу, в чем эта проблемаможет быть. Ниже приведены выдержки из моего конфига logstash и шаблонаasticsearch. Я включил их, потому что я пытаюсь использовать поле timestamp, чтобы сформулировать индекс в моей конфигурации logstash, скопировав timestamp в @timestamp, затем отформатировав его в формате YYY-MM-DD и используя эти сохраненные метаданные, чтобы сформулировать мой индекс

Logstash config:

input {
      stdin { type => stdin }
}
filter {
  csv {
     separator => " "   # this is a tab (/t) not just whitespace
     columns => ["timestamp","field1", "field2", ...]
     convert => {
       "timestamp" => "date_time"
       ...
     }
  }
}

filter {
  date {
    match => ["timestamp", "yyyy-MM-dd' 'HH:mm:ss'.'SSS'"]
    target => "@timestamp"
  }
}

filter {
  date_formatter {
    source => "@timestamp"
    target => "[@metadata][date]"
    pattern => "YYYY-MM-dd"
  }
}


filter {
  mutate {
    remove_field => [
      "@timestamp",
      ...
    ]
  }
}

output {
   amazon_es {
     hosts =>
         ["my-es-cluster.us-east-1.es.amazonaws.com"]
     index => "my-index-%{[@metadata][date]}"
     template => "my-config.json"
     template_name => "my-index-*"
     region => "us-east-1"
  }
}

Шаблон:

{
    "template" : "my-index-*",
    "mappings" : {
      "doc" : {
        "dynamic" : "false",
        "properties" : {

          "timestamp" : {
            "type" : "date"
          }, ...
    },
    "settings" : {
      "index" : {
        "number_of_shards" : "12",
        "number_of_replicas" : "0"
      }
    }
}

Когда я проверяю необработанные данные, это выглядит так, как показывает ошибка, и это выглядит хорошосформирован, поэтому я не уверен, что моя проблема

Вот пример строки, она была отредактирована, но поле проблемы не затронуто и является первым

2019-09-28 07:29:46.454 NA  2019-09-28 07:29:00 someApp 62847957802 62847957802

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Оказывается, источником проблемы был блок convert. logstash не может понять формат времени, указанный в файле. Для решения этой проблемы я изменил исходное поле timestamp на unformatted_timestamp и применил форматировщик даты, который уже использовал

filter {
  date {
    match => ["unformatted_timestamp", "yyyy-MM-dd' 'HH:mm:ss'.'SSS'"]
    target => "timestamp"
  }
}

filter {
  date_formatter {
    source => "timestamp"
    target => "[@metadata][date]"
    pattern => "YYYY-MM-dd"
  }
}
0 голосов
/ 03 ноября 2019

Вы анализируете свои строки, используя фильтр csv и устанавливая разделитель на пробел, но ваша дата также разделяется на пробел, таким образом, ваше первое поле с именем timestamp получает только дату 2019-09-28 ивремя находится в поле с именем field1.

. Вы можете решить свою проблему, создав новое поле с именем date_and_time, содержащее, например, поля с датой и временем.

csv {
    separator => " "
    columns => ["date","time","field1","field2","field3","field4","field5","field6"]
}
mutate {
    add_field => { "date_and_time" => "%{date} %{time}" }
}
mutate {
    remove_field => ["date","time"]
}

Это создаст поле с именем date_and_time со значением 2019-09-28 07:29:46.454, теперь вы можете использовать фильтр date для анализа этого значения в поле @timestamp, по умолчанию для logstash.

date {
    match => ["date_and_time", "YYYY-MM-dd HH:mm:ss.SSS"]
}

Это оставит вас с двумя полями с одинаковым значением, date_and_time и @timestamp, @timestamp является значением по умолчанию для logstash, поэтому я бы предложил сохранить его и удалить date_and_time, созданный ранее.

mutate {
    remove_field => ["date_and_time"]
}

Теперь вы можете создать индекс на основе даты, используя формат YYYY-MM-dd, и logstash извлечет дату из поля @timestamp, просто измените строку index в выходных данных для этого:

index => "my-index-%{+YYYY-MM-dd}"
...