我正在使用带有Elasticsearch的Logstash,因此,@ timestamp字段是必填文档字段。 @timestamp
字段的值始终为ISO8601格式。
来自Logstash的某些事件 / 文档没有特殊的timestamp
字段(请不要将其与_timestamp字段;这是从grok解析获得的另一个字段)所以我决定使用以下索引模板将@timestamp
映射到_timestamp
:
{
"settings" : {...},
"template" : "logstash-myindex-*",
"mappings": {
"_id" : {
"path": "myid"
},
"_timestamp" : {
"enabled" : true,
"stored" : true,
"path" : "@timestamp",
"format": "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'"
},
"property" : {
"@timestamp" : {
"type": "date",
"format": "YYYY-MM-dd'T'HH:mm:ss.SSS'Z'"
},
"myid" : {
"type": "string",
"index": "not_analyzed"
}
}
}
}
当我进行搜索时:
POST logstash-myindex-2014.12.16/_search
{
"fields": ["_timestamp", "_source"],
"query": {
"match_all": {}
}
}
我这样得到结果(只显示一个示例文档):
{
"_id": "AUeo39n78xpe_2ggb",
"_index": "logstash-myindex-2014.12.16",
"_score": 1.0,
"_source": {
"@timestamp": "2014-12-16T13:47:09.703Z",
"@version": "1",
"myid": "AUeo39n78xpe_2ggb"
"timestamp": 1418737629,
},
"_type": "logs",
"fields": {
"_timestamp": 1418737629000
}
}
好的,在这里您可以看到path
的{{1}}属性正常工作。它采用字段_id
的值并将其应用于myid
。
现在,转到_id
。这是它变得奇怪的地方。它不仅没有取_timestamp
(2014-12-16T13:47:09.703Z)的值,而是采用特殊时间戳字段的值(如上所述,这是一个从grok解析原始日志消息获得的字段)然后将其转换为毫秒。
期望的结果是@timestamp
将假设任何值_timestamp
成立。有人可以告诉我这里发生了什么吗?以前有人经历过吗?名为@timestamp
的字段与弹性搜索的timestamp
字段之间是否存在某种冲突?
答案 0 :(得分:0)
在Elasticsearch的内部,所有日期都存储为Epoch毫秒 - 因此_timestamp
格式看起来不错。
使用Epoch converter 1418737629000
的时间戳转换为Tue, 16 Dec 2014 13:47:09 GMT
。
这看起来非常接近你的@timestamp
值 - 毫秒被删除,就是这样。可能会有一个时区的改变让你失望?