首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何下载完整的AWS CloudWatch日志

如何下载完整的AWS CloudWatch日志
EN

Stack Overflow用户
提问于 2018-12-03 18:13:02
回答 1查看 10.3K关注 0票数 12

问题摘要

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

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

研究

我试图跟踪一个棘手的间歇性故障(瓶/Zappa,AWS )微服务。

我需要下载日志。

我可以检查CloudWatch中的日志:

这里有一篇文章是我想要的:

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

代码语言:javascript
复制
> 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,现在我看到它:

代码语言:javascript
复制
> 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观察到:

-限值(整数) 返回的最大日志事件数。如果您不指定一个值,则最大的日志事件最多可容纳1MB的响应大小,最多可达10,000个日志事件。

..。以及:

代码语言:javascript
复制
> ls -l wtf.txt
-rw-r--r--  1 pi  staff  1247053  3 Dec 10:55:14 2018 wtf.txt

所以它要超过1MB。所以看来日志太长了。我想要的是日志中最早的一段时间。

因此,问题是:如何下载完整的日志?

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

调用InvalidParameterException操作时发生错误( GetLogEvents ):检测到1验证错误:“极限”处的值“999999”未能满足约束:成员的值必须小于或等于10000

10000是默认的!而设定一个任意的限制也是丑陋的。不管我做了什么,日志都有可能更长。

如何使用文档化的"nextForwardToken"密钥?

代码语言:javascript
复制
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" )

如果我检查输出:

代码语言:javascript
复制
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":,这与传入的令牌相同!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-04 14:45:50

我建议尝试一下这个CLI工具。在我看来,它比AWS控制台和AWS工具更可靠。我用它在CloudWatch中搜索大量的日志流。您可以很容易地指定在CloudWatch日志流上搜索甚至grep的时间范围。您还可以实时查看日志流。下面的示例搜索组中指定时间范围内的所有日志流(还请参阅我正在使用tee查看模式错误并输出到文件和控制台):

代码语言:javascript
复制
awslogs get my_log_group ALL --start='23/1/2015 12:00' --end='23/1/2016 13:00' | grep ERROR | tee errlogs.txt
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53599497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档