我通常通过logstash插件将数据(日志)插入elasticsearch。然后我 可以从kibana搜索它们。
但是,如果我尝试以编程方式在Elasticsearch中插入数据(为了 跳过filebeat和logstash),则无法在kibana中找到数据。
这是我测试过的:
from elasticsearch import Elasticsearch
es = Elasticsearch(["XXX"], ...)
doc = {
"@version": 1,
"@timestamp": datetime.now(),
"timestamp": datetime.now(), # Just in case this is needed too
"message": "test message"
}
res = es.index(
index="foobar-2019.05.13", doc_type='whatever', id=3, body=doc,
refresh=True
)
# Doc is indexed by above code, as proved by
# es.search(
# index="foobar-*", body={"query": {"match_all": {}}}
#)
我在“索引模式->创建”中将索引模式“ foobar- *”添加到了kibana 索引模式”。然后,我可以使用“发现”页面在该页面中搜索文档 指数。但是,kibana找不到任何文件,即使这些文件存在于 弹性搜索。
我缺少什么?是否应该为索引配置任何映射?
(注意:使用6.x版本)
更新:已建立文档索引和索引映射的示例
# Example of doc indexed
{'_index': 'foobar-2019.05.13', '_type': 'doc', '_id': '41', '_score': 1.0,
'_source': {'author': 'foobar', 'message': 'karsa big and crazy. icarium crazy. mappo big.',
'timestamp': '2019-05-13T15:52:19.857898',
'@version': 1, '@timestamp': '2019-05-13T15:52:19.857900'}}
# mapping of foobar-2019.05.13'
{
"mapping": {
"doc": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "long"
},
"author": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"message": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"timestamp": {
"type": "date"
}
}
}
}
}
答案 0 :(得分:1)
我发现了问题...主机之间的时区差异为2小时 python代码正在运行,elasticsearch / kibana主机。
因此,由于我使用的是datetime.now()
,所以我插入的文档的时间戳是“未来几小时”,而我搜索的文档是“过去的任何地方”。
如果我将来会寻找它们(或者,如果我等待2个小时而不进行更新, 他们),就找到了。
使我难堪的错误。
解决我的问题是使用datetime.now(timezone.utc)