? ? ? ? 前段時間數(shù)據(jù)出了些問題,需要去查一些用戶的相關操作日志,我們公司所有的日志都是存放在efk中,由于用戶數(shù)據(jù)很多,不可能每一條一條去查,所以就在想能不能通過http的方式通過python去查,并打印出來。于是用了http+request方式進行請求,發(fā)現(xiàn)數(shù)據(jù)返回不OK。所以就對elasticsearch中的 http請求進行分析,發(fā)現(xiàn)elasticsearch雖然是用http請求的,但是在頭部里面的格式是不一樣的,因為字段“content-type”用的不是普通的json,而是用的application/x-ndjson,然后發(fā)現(xiàn)參數(shù)中的負載有兩個字典,一個是index開頭的,而第二個字典才是真正的傳值參數(shù)。因為以前沒有遇到過這種參數(shù),所以用python在請求,不管怎么組裝這個參數(shù)都不能返回正確的數(shù)據(jù)回來。

后面查了一下資料,關于elasticsearch如果要通過http去請求數(shù)據(jù)時,需要把參數(shù)的兩個字典重新組合,且在每個字典的后面一定要加上回車符號("\n")。具體的組合方法如下:
payload1= {"index": "tomcat-gateway-info-*", "ignore_unavailable": True, "preference": 1561910540186}
payload2= {"version": True, "size": 2000, "sort": [{"@timestamp": {"order": "desc", "unmapped_type": "boolean"}}],
? ? ? ? ? ? "_source": {"excludes": []}, "aggs": {"2": {
"date_histogram": {"field": "@timestamp", "interval": "3h", "time_zone": "Asia/Shanghai",
? ? ? ? ? ? ? ? ? ? ? ? ? "min_doc_count": 1}}}, "stored_fields": ["*"], "script_fields": {},
? ? ? ? ? ? "docvalue_fields": [{"field": "@timestamp", "format": "date_time"}], "query": {"bool": {
"must": [{"range": {"@timestamp": {"gte": 1561307158200, "lte": 1561911958200, "format": "epoch_millis"}}}],
? ? ? ? "filter": [{"multi_match": {"type": "best_fields", "query": trace_id, "lenient": True}}], "should": [],
? ? ? ? "must_not": []}},
? ? ? ? ? ? "highlight": {"pre_tags": ["@kibana-highlighted-field@"], "post_tags": ["@/kibana-highlighted-field@"],
? ? ? ? ? ? ? ? ? ? ? ? ? "fields": {"*": {}}, "fragment_size": 2147483647}, "timeout": "30000ms"}
data= json.dumps(payload1)+ "\n" + json.dumps(payload2)+ "\n"
以上代碼中payload1?和 payload2是兩個不同的字典,而data就是payload1 和payload2組合之后真正的參數(shù),那么請求時的參數(shù)就是data變量。
result= requests.post(url=url, data=data, headers=header)。
用這種方式向elasticsearch進行http請求之后,就能夠拿到正常的數(shù)據(jù)了。