Search code examples
pythonboto3

Getting all log events while passing optional argument


I am using boto3 api to get all the log events in cloud watch.

The following is my code

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)

Using this I am able to print all the log events for a specified instance id but i am not happy that i have to call .get_log_events twice. The reason is because when i make the first call i don't have a nextToken. I only have it after the initial call. Is there a way to simplify this so that i only make the get_log_events call once inside the while True loop.

I would love to hear some suggestions.


Solution

  • 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'])
        next_token = response.get('nextToken')
        params['nextToken'] = next_token if next_token else ''