import datetime
from elasticsearch import Elasticsearch
# 格式为:2016.7.19 的昨日日期
yesterday = (datetime.datetime.now() + datetime.timedelta(days = -1)).strftime("%Y.%m.%d")
# 格式为:2016-7-19 的昨日日期
filter_yesterday = (datetime.datetime.now() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
# 格式为:2016.7.18 的前天日期
before_yesterday = (datetime.datetime.now() + datetime.timedelta(days = -2)).strftime("%Y.%m.%d")
# 请求elasticsearch节点的url
url = "http://192.168.1.41:9200/"
# 使用的索引,因日期时区问题,所以要指定昨天和前天的索引名
index_name = "logstash-apache-www.linuxyw.com-{date},logstash-apache-www.linuxyw.com-{b_date}".format(date=yesterday,b_date=before_yesterday)
# 实例化Elasticsearch类,并设置超时间为120秒,默认是10秒的,如果数据量很大,时间设置更长一些
es = Elasticsearch(url,timeout=120)
# DSL查询语法,在下面es.search使用
data = {
"size": 10000000, #指定每个分片最大返回的数据量,可根据日志量进行设置
"query" : {
"bool":{
# 指定要匹配的字符,这里是查找所有数据
"must" : {"match_all":{}},
# 过滤,指定时间范围,这里设置成昨天0点到24点,代码上||-8h,因为ELK用的是UTC时间,跟北京时间误差8小时,所以要减8小时,这就是日志里的北京时间了
"filter" : {
"range" : { "@timestamp" : {
"gt" : "{date}T00:00:00||-8h".format(date=filter_yesterday),
"lt" : "{date}T23:59:59||-8h".format(date=filter_yesterday),
}
}
}
}
}
}
# 设置要过滤返回的字段值,要什么字段,就在这里添加,这样可以节约返回的数据量(带宽,内存等)
return_fields = [
'_scroll_id',
'hits.hits._source.timestamp',
'hits.hits._source.@timestamp',
'hits.hits._source.clientip',
'hits.hits._source.request',
]
def main():
# 指定search_type="scan"模式,并返回_scroll_id给es.scroll获取数据使用
res = es.search(
index=index_name,
body=data,
search_type="scan",
scroll="1m"
)
scrollId=res["_scroll_id"] # 获取scrollID
response= es.scroll(scroll_id=scrollId, scroll= "1m",filter_path=return_fields,)
print len(response['hits']['hits']) # 打印获取到的日志数量
# for hit in response['hits']['hits']:
# print hit['_source']
if __name__ == "__main__":
main()
elk python api 测试
最新推荐文章于 2025-06-25 23:27:03 发布