2013-04-01 10 views
6

Файлы журнала, которые я пытаюсь импортировать в Logstash, содержат поле, которое иногда выглядит как дата/время, а иногда нет. К сожалению, первое вхождение выглядело как дата/время, и кто-то (logstash или elasticsearch) решил определить поле как дату/время. При попытке импортировать более позднюю запись журнала, Elasticsearch имеет исключение:Logstash/ElasticSearch: недочеты для типа данных для поля

Failed to execute [index ...] 
org.elasticsearch.index.mapper.MapperParsingException: Failed to parse [@fields.field99] 
at org.elasticsearch.index.mapper.core.AbstractFieldMapper.parse(AbstractFieldMapper.java:320) 
at org.elasticsearch.index.mapper.object.ObjectMapper.serializeValue(ObjectMapper.java:587) 
... 
Caused by: java.lang.IllegalArgumentException: Invalid format: "empty" 
at org.elasticsearch.common.joda.time.format.DateTimeFormatter.parseMillis(DateTimeFormatter.java:747) 
... 

Вопрос: Как сказать logstash/elasticsearch не определить это поле как дату/время? Я хотел бы, чтобы все поля из моего журнала (кроме одного поля явного времени) были определены как просто текст.

Вопрос: похоже, что logstash отказывается от попыток импортировать записи из файла журнала после просмотра этого, который elasticsearch генерирует исключение. Как я могу сообщить logstash игнорировать это исключение и продолжать пытаться импортировать другие записи из файла журнала?

+0

Вот и все! Может быть, вы можете добавить свой ответ в качестве реального ответа, а не в самом вопросе, это того стоит. – javanna

+0

stackoverflow не позволил мне ответить на свой вопрос, так как вскоре я спросил его, потому что я ноб с плохой репутацией: D – allen

+0

Мне удалось перевести ответ на правильный ответ ниже, ожидая необходимого количества времени для ответа на мой вопрос собственный вопрос. – allen

ответ

9

Я сам нашел ответ на свой первый вопрос.

Прежде чем добавлять данные через Logstash, мне пришлось установить значения по умолчанию для Elasticsearch для обработки поля как «строка» вместо «date».

Я сделал это, создав defaults.js файл, как это:

{ 
    "template": "logstash-*", 
    "mappings": { 
     `"_default_"`: { 
      "dynamic_templates": [{ 
       "fields_template": { 
        "mapping": { "type": "string" }, 
        "path_match": "@fields.*" 
       } 
      }] 
     } 
    } 
} 

и говорить Elasticsearch использовать его перед добавлением каких-либо данных через Logstash:

локон -XPUT 'http://localhost:9200/_template/template_logstash/' -d @defaults_for_elasticsearch. js

Надеюсь, это поможет кому-то еще.

+2

Просто немного уточните: вы использовали [шаблон шаблона индекса api] (http://www.elasticsearch.org/guide/reference/api/admin-index-templates /), чтобы отправить шаблон индекса. Зачем? Поскольку logstash создает несколько индексов, обычно один в день. Все индексы, соответствующие шаблону, получат указанное сопоставление. Кроме того, вы использовали сопоставление ['_default_'] (http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping/), чтобы все типы получили заданное сопоставление. В рамках сопоставления вы использовали [динамический шаблон] (http://www.elasticsearch.org/guide/reference/mapping/root-object-type/);) – javanna