Получение всех событий журнала при передаче необязательного аргумента

#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']