Как скачать полный журнал AWS CloudWatch - PullRequest
0 голосов
/ 03 декабря 2018

РЕЗЮМЕ ВОПРОСА

Как загрузить полный журнал из CloudWatch с помощью инструментов CLI?

Загружаемый журнал является неполным.Я знаю это, потому что, если я переверну заказ, используя --start-from-head, я получу новый контент.Не просто в обратном порядке.


RESEARCH

Я пытаюсь отследить хитрый прерывистый сбой в микросервисе (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 МБ, до 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": - это тот же токен, который был передан!

1 Ответ

0 голосов
/ 04 декабря 2018

Я бы порекомендовал попробовать этот CLI tool .На мой взгляд, он намного надежнее консоли AWS и инструмента CLI AWS.Я использовал его для поиска больших потоков журналов в CloudWatch.Вы можете легко указать временной диапазон для поиска или даже просмотра потоков журнала CloudWatch.Вы также можете посмотреть поток логов в режиме реального времени.В приведенном ниже примере выполняется поиск по всем потокам журналов в группе для указанного временного диапазона (см. Также, что я подбираю шаблон для ОШИБКИ и выводу в файл и консоль с помощью tee):

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