我遇到了同样的问题; Logstash 会很高兴地完成它的工作,但是 Elasticsearch 会抱怨同样的错误。您可以看到使用正确的变量生成了“@timestamp”。关键是要理解这种错误是它说如下内容的地方:
[2020-07-22 12:27:40,814][DEBUG][action.bulk ] [logs-p03] [logstash-2020.07.22][0] failed to execute bulk item (index) index {[logstash-2020.07.22][logs] ... org.elasticsearch.index.mapper.MapperParsingException: failed to parse [shibidp_timestamp]
...
Caused by: org.elasticsearch.index.mapper.MapperParsingException: failed to parse date field [20200722T002739Z], tried both date format [dateOptionalTime], and timestamp number with locale []
...
Caused by: java.lang.IllegalArgumentException: Invalid format: "20200722T002739Z" is malformed at "2739Z"
这表明映射很混乱......让我们看看:
GET http://127.0.0.1:9200/logstash-2020.07.22/_mapping
...
"shibidp_severity" : {
"type" : "string",
"index" : "not_analyzed",
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"shibidp_timestamp" : {
"type" : "date",
"format" : "dateOptionalTime"
},
...
我包含 shibidp_severity 只是为了展示大多数(字符串)是如何映射的。该模板不包含与 shibidp_timestamp 匹配的任何内容,或任何其他被映射为“日期”类型且格式为:“dateOptionalTime”的字段
映射到此的字段(查看 GET http://127.0.0.1:9200/logstash-2020.07.22/_mapping)
- @timestamp
- 日期
- shibidp_timestamp
这种行为似乎与动态日期检测有关
https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-field-mapping.html
https://www.elastic.co/guide/en/elasticsearch/reference/1.7/mapping-dynamic-mapping.html
在我的例子中,这种动态映射导致了一些竞争条件(遇到的第一个 'shibidp_timestamp' 值通知了当天索引的映射。让我们看看区别:
$ (d="2020.07.18"; curl -s http://127.0.0.1:9200/logstash-$d/_mapping | jq -c '.["logstash-'$d'"].mappings.logs.properties.shibidp_timestamp')
{"fields":{"raw":{"ignore_above":256,"index":"not_analyzed","type":"string"}},"index":"not_analyzed","type":"string"}
$ (d="2020.07.19"; curl -s http://127.0.0.1:9200/logstash-$d/_mapping | jq -c '.["logstash-'$d'"].mappings.logs.properties.shibidp_timestamp')
{"format":"dateOptionalTime","type":"date"}
这显示了 shibidp_timestamp 在两个不同的每日索引中的映射。前者是我们遇到看起来像字符串的东西时得到的;后者是当它看起来像时间戳时我们得到的东西(但无法解析为时间戳)
你可以做一些事情来解决这个问题: