2013-04-01 8 views
6

I file di registro che sto cercando di importare in Logstash contengono un campo che a volte sembra una data/ora e talvolta non lo è. Sfortunatamente, la prima occorrenza sembra una data/ora e qualcuno (logstash o elasticsearch) ha deciso di definire il campo come data/ora. Quando si cerca di importare un record di log dopo, elasticsearch ha un'eccezione:Logstash/ElasticSearch: non è corretto per il tipo di dati per il campo

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) 
... 

Domanda: Come faccio a dire logstash/elasticsearch di non definire questo campo come data/ora? Vorrei che tutti i campi del mio log (ad eccezione di un campo di timestamp esplicito) fossero definiti come solo testo.

Domanda: sembra che logstash dà a cercare di importare i record dal file di registro dopo aver visto questo quello che elasticsearch genera un'eccezione su. Come posso dire a logstash di ignorare questa eccezione e continuare a cercare di importare gli altri record dal file di registro?

+0

Questo è tutto! Forse puoi aggiungere la tua risposta come risposta reale invece che all'interno della domanda stessa, ne vale la pena. – javanna

+0

StackOverflow non mi consente di rispondere alla mia domanda così presto dopo averlo chiesto poiché sono un noob con una cattiva reputazione: D – allen

+0

Sono stato in grado di spostare la risposta a una risposta corretta di seguito dopo aver atteso il tempo richiesto per rispondere al mio propria domanda – allen

risposta

9

Ho trovato la risposta alla mia prima domanda da solo.

Prima di aggiungere dati tramite Logstash, ho dovuto impostare i valori predefiniti affinché Elasticsearch considerasse il campo "stringa" anziché "data".

Ho fatto questo con la creazione di un file defaults.js come questo:

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

e dicendo elasticsearch di usarlo prima di aggiungere eventuali dati attraverso Logstash:

ricciolo -XPUT 'http://localhost:9200/_template/template_logstash/' -d @defaults_for_elasticsearch. js

Spero che questo aiuti qualcun altro.

+2

Solo per elaborare un po ': hai usato il [put index template api] (http://www.elasticsearch.org/guide/reference/api/admin-indices-templates /) per inviare un modello di indice. Perché? Perché logstash crea più indici, di solito uno al giorno. Tutti gli indici che corrispondono al modello otterranno la mappatura specificata. Inoltre, hai utilizzato la mappatura ['_default_'] (http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping/) in modo che tutti i tipi ottengano la mappatura specificata. All'interno della mappatura, hai usato un [modello dinamico] (http://www.elasticsearch.org/guide/reference/mapping/root-object-type/);) – javanna

Problemi correlati