Logstash/ElasticSearch:对于字段的数据类型猜测错误

all*_*len 6 elasticsearch logstash

我试图导入Logstash的日志文件包含一个有时看起来像日期/时间的字段,有时却没有.不幸的是,第一次出现看起来像日期/时间,某人(logstash或elasticsearch)决定将该字段定义为日期/时间.尝试导入以后的日志记录时,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)  
...  
Run Code Online (Sandbox Code Playgroud)

问题:如何告诉logstash/elasticsearch不将此字段定义为日期/时间?我希望我的日志中的所有字段(除了一个显式时间戳字段)都被定义为文本.

问题:似乎logstash在看到弹性搜索引发异常的日志之后放弃尝试从日志文件中导入记录.如何告诉logstash忽略此异常并继续尝试从日志文件中导入其他记录?

all*_*len 9

我自己找到了第一个问题的答案.

在通过Logstash添加数据之前,我必须设置Elasticsearch的默认值,将字段视为"字符串"而不是"日期".

我这样做是通过创建一个defaults.js文件,如下所示:

{  
    "template": "logstash-*",  
    "mappings": {  
        `"_default_"`: {  
            "dynamic_templates": [{  
                "fields_template": {  
                    "mapping": { "type": "string" },  
                    "path_match": "@fields.*"  
                }  
            }]  
        }  
    }  
}
Run Code Online (Sandbox Code Playgroud)

并告诉Elasticsearch在通过Logstash添加任何数据之前使用它:

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

希望这有助于其他人.

  • 稍微详细说明一下:您使用[put index template 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/);) (3认同)