我将 Logstash 与 Elasticsearch 结合使用,因此 @timestamp 字段是必填文档字段。
@timestamp
字段的值始终为 ISO8601 格式。
来自 Logstash 的一些 events/documents 没有特殊的
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
的_id
属性正在工作。它采用字段 myid
的值并将其应用于 _id
。
现在,继续
_timestamp
。这就是它变得奇怪的地方。它不仅不采用@timestamp
(2014-12-16T13:47:09.703Z) 的值,而是采用special timestamp 字段 的值(如前所述,这是从 grok 解析原始字段中获得的字段日志消息),然后将其转换为毫秒。
期望的结果是
_timestamp
将采用 @timestamp
持有的任何值。有人可以告诉我这是怎么回事吗?以前有人经历过吗?称为 timestamp
的字段和 Elastic Search 的 _timestamp
字段之间是否存在某种冲突?
在 Elasticsearch 内部,所有日期都存储为 Epoch 毫秒 - 因此
_timestamp
格式看起来不错。
使用 Epoch 转换器
1418737629000
的时间戳转换为 Tue, 16 Dec 2014 13:47:09 GMT
.
这看起来非常接近您的
@timestamp
值 - 毫秒已被删除,仅此而已。可能是时区变化让您感到困惑?