Pythonを使用してローカルElasticSearch(localhost:9200)にエントリを追加しています
現在、私はこの方法を使用しています:
_def insertintoes(data):
"""
Insert data into ElasicSearch
:param data: dict
:return:
"""
timestamp = data.get('@timestamp')
logstashIndex = 'logstash-' + timestamp.strftime("%Y.%m.%d")
es = Elasticsearch()
if not es.indices.exists(logstashIndex):
# Setting mappings for index
mapping = '''
{
"mappings": {
"_default_": {
"_all": {
"enabled": true,
"norms": false
},
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"norms": false,
"type": "text"
}
}
},
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"fields": {
"keyword": {
"type": "keyword"
}
},
"norms": false,
"type": "text"
}
}
}
],
"properties": {
"@timestamp": {
"type": "date",
"include_in_all": true
},
"@version": {
"type": "keyword",
"include_in_all": true
}
}
}
}
}
'''
es.indices.create(logstashIndex, ignore=400, body=mapping)
es.index(index=logstashIndex, doc_type='system', timestamp=timestamp, body=data)
_
data
はdict
構造体であり、有効な_@timestamp
_は次のように定義されていますdata['@timestamp'] = datetime.datetime.now()
問題は、データにタイムスタンプ値が含まれていても、Kibanaが"discovery"フィールドにエントリを表示しないことです。 :(
ElasicSearchの完全なエントリの例を次に示します。
{ "_index": "logstash-2017.06.25", "_type": "system", "_id": "AVzf3QX3iazKBndbIkg4", "_score": 1, "_source": { "priority": 6, "uid": 0, "gid": 0, "systemd_slice": "system.slice", "cap_effective": "1fffffffff", "exe": "/usr/bin/bash", "hostname": "ns3003395", "syslog_facility": 9, "comm": "crond", "systemd_cgroup": "/system.slice/cronie.service", "systemd_unit": "cronie.service", "syslog_identifier": "CROND", "message": "(root) CMD (/usr/local/rtm/bin/rtm 14 > /dev/null 2> /dev/null)", "systemd_invocation_id": "9228b6c72e6a4624a1806e4c59af8d04", "syslog_pid": 26652, "pid": 26652, "@timestamp": "2017-06-25T17:27:01.734453" } }
ご覧のとおり、IS _@timestamp
_フィールドがありますが、Kibanaが期待しているものではないようです。
そして、私のエントリをKibanaで表示するにはどうすればよいかわかりません。
何か案が ?
Elasticsearchは@timestampを日付としてではなく、文字列として認識します。データ['@timestamp']が日時オブジェクトの場合は、自動的に認識されるISO文字列に変換してみてください。次のことを試してください。
timestamp = data.get('@timestamp').isoformat()
タイムスタンプは文字列になりますが、ISO形式です