#python #boto3
Вопрос:
Я использую api boto3 для получения всех событий журнала в cloud watch.
Ниже приведен мой код
import boto3
client = boto3.client("logs")
LOG_GROUP_NAME = "/foo/bar/foo-jobs/foo"
instance_id= "i-somefooid"
log_events = []
response = client.get_log_events(logGroupName=LOG_GROUP_NAME, logStreamName=instance_id, startFromHead=True)
log_events.extend(response["events"])
next_token = response["nextForwardToken"]
while True:
response = client.get_log_events(logGroupName=LOG_GROUP_NAME, logStreamName=instance_id, nextToken=next_token)
log_events.extend(response["events"])
if next_token == response["nextForwardToken"]:
break
next_token = response["nextForwardToken"]
print(log_events)
Используя это, я могу распечатать все события журнала для указанного идентификатора экземпляра, но я не рад, что мне приходится звонить .get_log_events
дважды. Причина в том, что, когда я делаю первый звонок, у меня нет nextToken
. Он у меня только после первого звонка. Есть ли способ упростить это, чтобы я делал get_log_events
вызов только один раз внутри цикла while True.
Я хотел бы услышать некоторые предложения.
Комментарии:
1. То, что вам нужно, — это пагинатор, который обрабатывает следующую логику для вас: boto3.amazonaws.com/v1/documentation/api/latest/reference/…
2. Можете ли вы показать мне, как этим пользоваться? Я был бы вам очень признателен.
Ответ №1:
import boto3
log_client = boto3.client('logs')
params = {
'logGroupName': "/foo/bar/foo-jobs/foo",
'logStreamName': "i-somefooid"
}
log_events = []
while params.get('NextToken') != '':
response = log_client.get_log_events(**params)
log_events.extend(response['events'])
params['NextToken'] = response['NextToken']