我将Logstash与Elasticearch一起使用,因此,@Timestamp字段是必填的文档字段。@timestamp
字段的值始终为ISO8601格式。
来自Logstash的一些Events/Documents没有特殊的timestamp
字段(请不要将其与_Timestamp字段混淆;这是从grok解析获得的另一个字段),因此我决定使用以下索引模板将@timestamp
Map到_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
}
}
好的,在这里您可以看到_id
的path
属性正在工作。它获取字段myid
的值并将其应用于_id
。
现在,继续到_timestamp
。这就是事情变得奇怪的地方。它不仅不获取@timestamp
(2014-12-16T13:47:09.703Z)的值,而是获取特殊时间戳字段的值(如上所述,这是通过grok解析原始日志消息获得的字段),然后将其转换为毫秒。
期望的结果是_timestamp
将采用@timestamp
保持的任何值。有人能告诉我这是怎么回事吗?以前有人经历过这种情况吗?在名为timestamp
的字段和ElasticSearch的_timestamp
字段之间是否存在某种冲突?
1条答案
按热度按时间juud5qan1#
在Elasticearch内部,所有日期都存储为Epoch毫秒-因此
_timestamp
格式看起来很好。使用Epoch converter将时间戳
1418737629000
转换为Tue, 16 Dec 2014 13:47:09 GMT
。这看起来非常接近您的
@timestamp
值-毫秒已被丢弃,仅此而已。有没有可能是时区的改变让你感到不安?