【问题标题】:Download AWS CloudWatch logs for a period下载一段时间的 AWS CloudWatch 日志
【发布时间】:2023-01-07 04:38:33
【问题描述】:

我想从 AWS 下载所有 CloudWatch 日志用于:

  • 一个特定的日志组
  • 特定时间范围

我的计划很简单:

  1. 遍历日志组的所有日志流。
  2. 对于每个日志流,迭代事件并构建所有日志事件的列表。
    import boto3
    
    
    def overlaps(start1, end1, start2, end2):
        return max(start1, start2) < min(end1, end2)
    
    
    def load_logs(region, group, start=0, end=2672995600000):
        client = boto3.client('logs', region_name=region)
        paginator = client.get_paginator('describe_log_streams')
    
        response_iterator = paginator.paginate(logGroupName=group)
        events = []
        for page in response_iterator:
            for log_stream in page["logStreams"]:
                print(f"Stream: {log_stream['logStreamName']}, start: {log_stream['firstEventTimestamp']} end: {log_stream['lastEventTimestamp']}")
                if overlaps(log_stream["firstEventTimestamp"], log_stream["lastEventTimestamp"], start, end):
                    print("processing")
                    token = None
                    while True:
                        event_args = {
                            "logGroupName": group,
                            "logStreamName": log_stream['logStreamName'],
                            "startTime": start,
                            "endTime": end
                        }
    
                        if token is not None:
                            event_args["nextToken"] = token
    
                        response = client.get_log_events(**event_args)
    
                        for event in response["events"]:
                            if start < event["timestamp"] < end:
                                events.append(event)
    
                        if response["nextBackwardToken"] == token:
                            break
                        else:
                            token = response["nextBackwardToken"]
    
        print(events)
    

    我将 0 作为 start 传递,将遥远的未来 2672995600000 作为 end 传递,并且下载了一些事件,但是 events 列表不包含所有日志事件。我缺少一些迭代吗?我特别关心get_log_eventsiteration

【问题讨论】:

    标签: python amazon-web-services loops amazon-cloudwatch amazon-cloudwatchlogs


    【解决方案1】:

    您可以使用 start_query 它将返回所有日志流中的所有日志。

    import boto3
    from datetime import datetime, timedelta
    import time
    
    client = boto3.client('logs')
    
    query = "fields @timestamp, @message"
    
    log_group = 'NAME_OF_YOUR_LOG_GROUP'
    
    start_query_response = client.start_query(
        logGroupName=log_group,
        startTime=int((datetime.today() - timedelta(hours=24)).timestamp()),
        endTime=int(datetime.now().timestamp()),
        queryString=query,
    )
    

    【讨论】:

      猜你喜欢
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 1970-01-01
      • 2020-01-24
      • 2015-11-23
      • 2016-11-27
      相关资源
      最近更新 更多