2013-04-01 25 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

因爲我是一個聲譽不好的noob,所以stackoverflow不會讓我在回答自己的問題後很快回答:D – allen

+0

在等待所需的時間回答我的問題後,我能夠將答案移動到下面的正確答案自己的問題。 – allen

回答

9

我自己找到了第一個問題的答案。

在通過Logstash添加數據之前,我必須設置Elasticsearch的默認值,將字段視爲「字符串」而不是「日期」。

我這樣做是通過創建一個像這樣的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-indices-templates /)提交索引模板。爲什麼?由於logstash會創建多個索引,通常每天都有一個索引。與模式匹配的所有索引都將獲得指定的映射。此外,您使用['_default_'](http://www.elasticsearch.org/guide/reference/mapping/dynamic-mapping/)映射,以便所有類型都將獲得指定的映射。在映射中,您使用了[動態模板](http://www.elasticsearch.org/guide/reference/mapping/root-object-type/);) – javanna

相關問題