如何下载完整的AWS CloudWatch日志

时间:2018-12-03 18:13:02

标签: logging amazon-cloudwatch

问题摘要

如何使用CLI工具从CloudWatch下载完整日志?

我下载的日志不完整。我知道这是因为,如果我使用--start-from-head颠倒顺序,就会得到新的内容。不只是逆序。


重新搜索

我正在尝试跟踪(Flask / Zappa,AWS lambda)微服务中的棘手间歇性故障。

我需要下载日志。

我可以检查CloudWatch中的日志:

这是其中包含我所追求的文字的

enter image description here

但是,如果我下载此日志,则下载的文件包含以下文本:

> aws logs get-log-events --log-group-name '/aws/lambda/api-dev' --log-stream-name '2018/12/01/[$LATEST]59bc7e539d7948688e0666f8ed14822a' > wtf.txt

> cat wtf.txt | grep "timer"

即没事

现在,如果我添加--start-from-head,现在我看到了:

> aws logs get-log-events --log-group-name '/aws/lambda/api-dev' --log-stream-name '2018/12/01/[$LATEST]59bc7e539d7948688e0666f8ed14822a' --start-from-head  > wtf.txt

> cat wtf.txt | grep "timer"
        "message": "> > >  starting game timer  < < <\n",

https://docs.aws.amazon.com/cli/latest/reference/logs/get-log-events.html观察到:

  

-限制(整数)

     

返回的最大日志事件数。如果您未指定值,则最大日志事件数为1 MB响应大小时可以容纳的日志事件数,最多10,000个日志事件。

...和:

> ls -l wtf.txt
-rw-r--r--  1 pi  staff  1247053  3 Dec 10:55:14 2018 wtf.txt

因此它已超过1MB。因此,似乎日志太长。我追求的文字最早是在日志中。

问题就变成了:如何下载完整的日志?

我尝试设置更高的--limit,但得到:

  

调用GetLogEvents操作时发生错误(InvalidParameterException):检测到1个验证错误:'limit'处的值'999999'无法满足约束:成员的值必须小于或等于10000

默认值为10000!无论如何,设置任意限制是很丑陋的。无论我设置了什么,都有可能日志会更长。

如何使用已记录的"nextForwardToken"键?

def get_complete_log(stream_name):
    nextForwardToken = None

    while True:
        param_group =  " --log-group-name '/aws/lambda/api-dev'"
        param_stream = " --log-stream-name '" + stream_name + "'"
        param_token = (" --next-token '" + nextForwardToken + "'") if nextForwardToken else ""

        params = param_group + param_stream + param_token

        cmd = "aws logs get-log-events" + params + " > logs/tmp.txt"
        print(cmd)
        system(cmd)      

        with open('logs/tmp.txt','r') as f:
            tmp = f.read()

            print('CONTENTS:', tmp[:120], '\n')

            J = json.loads( tmp )

        nextForwardToken = J.get("nextForwardToken")

        if not nextForwardToken:
            break


get_complete_log( "2018/12/01/[$LATEST]59bc7e539d7948688e0666f8ed14822a" )

如果我检查输出:

aws logs get-log-events --log-group-name '/aws/lambda/api-dev' --log-stream-name '2018/12/01/[$LATEST]030c7bd5c6ff4d9eb3bb56b8607746b8' > logs/tmp.txt
CONTENTS: {
    "events": [
        {
            "timestamp": 1543707627572,
            "message": "START RequestId: 7b34fa3b-f5 

aws logs get-log-events --log-group-name '/aws/lambda/api-dev' --log-stream-name '2018/12/01/[$LATEST]030c7bd5c6ff4d9eb3bb56b8607746b8' --next-token 'f/34426362085021867195594556764906427633106607331166978053' > logs/tmp.txt
CONTENTS: {
    "events": [],
    "nextForwardToken": "f/34426362085021867195594556764906427633106607331166978053",
    "nextBackw 

因此,除第一次调用外,所有其他东西都返回"events": []"nextForwardToken":是传入的相同令牌!

1 个答案:

答案 0 :(得分:2)

我建议尝试使用此CLI tool。我认为,它比AWS控制台和AWS CLI工具可靠得多。我用它来搜索CloudWatch中的大量日志流。您可以轻松地指定时间范围,甚至可以通过CloudWatch日志流搜索甚至grep。您还可以实时查看日志流。下面的示例在组中的所有日志流中搜索指定的时间范围(另请参见我正在为错误模式grep并使用tee输出到文件和控制台):

awslogs get my_log_group ALL --start='23/1/2015 12:00' --end='23/1/2016 13:00' | grep ERROR | tee errlogs.txt