РЕЗЮМЕ ВОПРОСА
Как загрузить полный журнал из CloudWatch с помощью инструментов CLI?
Загружаемый журнал является неполным.Я знаю это, потому что, если я переверну заказ, используя --start-from-head
, я получу новый контент.Не просто в обратном порядке.
RESEARCH
Я пытаюсь отследить хитрый прерывистый сбой в микросервисе (Flask / Zappa, AWS lambda).
Мне нужно скачать журналы.
Я могу просмотреть журналы в CloudWatch:
Вот один, содержащий текст, который я ищу:
![enter image description here](https://i.stack.imgur.com/gQ6yB.png)
Однако, если я загружаю этот журнал, загруженный файл не содержит этот текст:
> 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 МБ, до 10 000 событий журнала.
... и:
> ls -l wtf.txt
-rw-r--r-- 1 pi staff 1247053 3 Dec 10:55:14 2018 wtf.txt
Так что это превышает 1 МБ.Таким образом, кажется, что журнал слишком длинный.Текст, который я ищу, находится в самом раннем периоде в журнале.
Таким образом, возникает вопрос: Как загрузить полный журнал?
Я пытаюсь установить более высокое значение --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":
- это тот же токен, который был передан!