【问题标题】:How to print the most recent Cloudwatch log for a certain Lambda function from the AWS CLI?如何从 AWS CLI 打印某个 Lambda 函数的最新 Cloudwatch 日志?
【发布时间】:2019-06-24 19:04:58
【问题描述】:

我正在尝试使用 AWS CLI 和 ASK CLI 来编写 Alexa 技能,并且我希望能够使用 Alexa 模拟器并直接从命令行查看控制台日志以简化操作,但我不知道如何从命令行查看最后一个。

我已经安装了 AWS 和 ASK CLI,并且能够查看 Cloudwatch 日志,但没有快速查看最后一个日志的方法。

【问题讨论】:

  • Cloudwatch 有一点延迟。像“datadog”这样的工具可以帮助增加一些组织,但你不能让它更快。
  • 将日志类型标志设置为 Tail 将允许您立即以 base64 编码字符串获取日志。看我的回答stackoverflow.com/a/56814765/112233

标签: amazon-web-services aws-lambda aws-cli amazon-cloudwatchlogs


【解决方案1】:

您可以使用aws logs describe-log-streams 获取最新的流名称,然后使用aws logs get-log-events 获取日志记录本身。

LOG_GROUP=log-group
aws logs get-log-events --log-group-name $LOG_GROUP --log-stream-name `aws logs describe-log-streams --log-group-name $LOG_GROUP --max-items 1 --order-by LastEventTime --descending --query logStreams[].logStreamName --output text | head -n 1` --query events[].message --output text

借助最新的 AWS CLI,您还可以使用 tail。

aws logs tail $LOG_GROUP --follow

【讨论】:

    【解决方案2】:

    使用 log-type 标志,您将能够从执行中获取 cloudwatch 日志。例如:

    LOG_RESULT=$(aws lambda invoke --function-name arn:aws:lambda:REGION:111122223333:function:YOUR_LAMBDA_NAME --log-type Tail outfile --query LogResult --output text)
    
    echo $LOG_RESULT | base64 -D
    
    

    输出

    START RequestId: 3ab54034-ed40-4fd7-b660-17db96a25f59 Version: $LATEST
    END RequestId: 3ab54034-ed40-4fd7-b660-17db96a25f59
    REPORT RequestId: 3ab54034-ed40-4fd7-b660-17db96a25f59  Duration: 71.48 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 74 MB
    

    这假设函数是同步执行的,但是与 eventType RequestResponse.

    如果您仍然需要实际的 CloudWatch 日志,您可以根据请求 ID 进行查询。

    REQUEST_ID=$(echo $LOG_RESULT | base64 -D | grep START | cut -d " " -f 3)
    aws logs filter-log-events --log-group-name /aws/lambda/YOUR_LAMBDA_NAME --filter-pattern \"$REQUEST_ID\" 
    

    输出

    {
        "events": [
            {
                "logStreamName": "2019/06/29/[$LATEST]f94a9c338ec445cda688c015b460621d",
                "timestamp": 1561775888037,
                "message": "START RequestId: 3ab54034-ed40-4fd7-b660-17db96a25f59 Version: $LATEST\n",
                "ingestionTime": 1561775888119,
                "eventId": "34828766136322027826299000340819150179641895561445048320"
            },
            {
                "logStreamName": "2019/06/29/[$LATEST]f94a9c338ec445cda688c015b460621d",
                "timestamp": 1561775888113,
                "message": "END RequestId: 3ab54034-ed40-4fd7-b660-17db96a25f59\n",
                "ingestionTime": 1561775903178,
                "eventId": "34828766138016884461387327717780753707358087734557278208"
            },
            {
                "logStreamName": "2019/06/29/[$LATEST]f94a9c338ec445cda688c015b460621d",
                "timestamp": 1561775888113,
                "message": "REPORT RequestId: 3ab54034-ed40-4fd7-b660-17db96a25f59\tDuration: 71.48 ms\tBilled Duration: 100 ms \tMemory Size: 128 MB\tMax Memory Used: 74 MB\t\n",
                "ingestionTime": 1561775903178,
                "eventId": "34828766138016884461387327717780753707358087734557278209"
            }
        ],
        "searchedLogStreams": [
            {
                "logStreamName": "2019/06/29/[$LATEST]f94a9c338ec445cda688c015b460621d",
                "searchedCompletely": true
            }
        ]
    }
    

    但是,此输出不按顺序排列,其中包含有关日志流本身以及搜索了哪些日志组的信息。

    然后您可以使用此命令对其进行过滤:

    aws logs filter-log-events --log-group-name /aws/lambda/YOUR_LAMBDA_NAME --filter-pattern \"$REQUEST_ID\" --query 'sort_by(events, &timestamp)[*].[message]' | jq .[][0]

    输出

    "START RequestId: 610dcebf-bb7b-4c39-895b-8989b46386a8 Version: $LATEST\n"
    "END RequestId: 610dcebf-bb7b-4c39-895b-8989b46386a8\n"
    "REPORT RequestId: 610dcebf-bb7b-4c39-895b-8989b46386a8\tDuration: 154.04 ms\tBilled Duration: 200 ms \tMemory Size: 128 MB\tMax Memory Used: 73 MB\t\n"
    

    【讨论】:

    • base64 -D 在 mac 上对我不起作用,但 base64 -Dd 对我有用(--decode 也适用)
    【解决方案3】:

    如果有人仍在苦苦挣扎并想使用 AWS CLI 提取最新的日志流

    aws logs describe-log-streams --log-group-name '/aws/lambda/ [YOUR_LAMBDA_FUNCTION_NAME_GOES_HERE]' --query 'logStreams[*].logStreamName' --max-items 1 --order-by LastEventTime --descending
    

    或者您想查询可以使用的单个 lambda 的所有日志流

    aws logs describe-log-streams --log-group-name '/aws/lambda/[YOUR_LAMBDA_FUNCTION_NAME_GOES_HERE]' --query 'logStreams[*].logStreamName'
    

    【讨论】:

      【解决方案4】:

      有几个有用的开源工具可以提供帮助:

      【讨论】:

        猜你喜欢
        • 2018-09-22
        • 2019-09-14
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 2016-03-22
        • 2019-02-19
        • 2018-11-13
        • 1970-01-01
        相关资源
        最近更新 更多