问题摘要
如何使用CLI工具从CloudWatch下载完整的日志?
我下载的日志是不完整的。我知道这一点,因为如果我使用--start-from-head颠倒顺序,我就会得到新的内容。不仅仅是倒序。
研究
我试图跟踪一个棘手的间歇性故障(瓶/Zappa,AWS )微服务。
我需要下载日志。
我可以检查CloudWatch中的日志:
这里有一篇文章是我想要的:

但是,如果我下载此日志,则下载的文件不包含以下文本:
> 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观察到:
-限值(整数) 返回的最大日志事件数。如果您不指定一个值,则最大的日志事件最多可容纳1MB的响应大小,最多可达10,000个日志事件。
..。以及:
> 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"密钥?
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":,这与传入的令牌相同!
发布于 2018-12-04 14:45:50
我建议尝试一下这个CLI工具。在我看来,它比AWS控制台和AWS工具更可靠。我用它在CloudWatch中搜索大量的日志流。您可以很容易地指定在CloudWatch日志流上搜索甚至grep的时间范围。您还可以实时查看日志流。下面的示例搜索组中指定时间范围内的所有日志流(还请参阅我正在使用tee查看模式错误并输出到文件和控制台):
awslogs get my_log_group ALL --start='23/1/2015 12:00' --end='23/1/2016 13:00' | grep ERROR | tee errlogs.txthttps://stackoverflow.com/questions/53599497
复制相似问题