问题摘要
如何使用CLI工具从CloudWatch下载完整日志?
我下载的日志不完整。我知道这是因为,如果我使用--start-from-head
颠倒顺序,就会得到新的内容。不只是逆序。
重新搜索
我正在尝试跟踪(Flask / Zappa,AWS lambda)微服务中的棘手间歇性故障。
我需要下载日志。
我可以检查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观察到:
-限制(整数)
返回的最大日志事件数。如果您未指定值,则最大日志事件数为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":
是传入的相同令牌!
答案 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