我尝试导入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)
...
问题:如何告诉logstash / elasticsearch不将此字段定义为日期/时间?我希望我的日志中的所有字段(除了一个显式的时间戳字段)都被定义为文本。
问题:看到logstash在看到弹性搜索引发异常的日志后放弃尝试从日志文件导入记录。如何告诉logstash忽略此异常并继续尝试从日志文件中导入其他记录?
答案 0 :(得分:9)
我自己找到了第一个问题的答案。
在通过Logstash添加数据之前,我必须设置Elasticsearch的默认值,将字段视为“字符串”而不是“日期”。
我是通过创建这样的defaults.js文件来完成的:
{
"template": "logstash-*",
"mappings": {
`"_default_"`: {
"dynamic_templates": [{
"fields_template": {
"mapping": { "type": "string" },
"path_match": "@fields.*"
}
}]
}
}
}
告诉Elasticsearch在通过Logstash添加任何数据之前使用它:
curl -XPUT 'http://localhost:9200/_template/template_logstash/'
-d @ defaults_for_elasticsearch.js
希望这有助于其他人。