Ответ 1
Посмотрите на awslogs.
Если вам довелось работать с Lambda/API Gateway, обратите внимание на apilogs.
Я могу просмотреть журнал, используя следующую команду.
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --limit 100
что это за команда, чтобы получить функцию вроде tail -f
чтобы я мог видеть журнал в реальном времени
Посмотрите на awslogs.
Если вам довелось работать с Lambda/API Gateway, обратите внимание на apilogs.
Я был очень разочарован awslogs
и cwtail
поэтому я создал собственный инструмент под названием Saw, который эффективно транслирует журналы CloudWatch на консоль (и раскрашивает вывод JSON):
Вы можете установить его на MacOS с помощью:
brew tap TylerBrock/saw
brew install saw
Он обладает множеством полезных функций, таких как возможность автоматического расширения (отступа) вывода JSON (попробуйте запустить инструмент с --expand
):
saw watch my_log_group --expand
У вас есть лямбда, которую вы хотите увидеть в журналах ошибок? Нет проблем:
saw watch /aws/lambda/my_func --filter error
Увидел это замечательно, потому что вывод легко читается, и вы можете транслировать журналы из всей группы журналов, а не только из одного потока в группе. Фильтрация и просмотр потоков с определенным префиксом также просто!
Я только что обнаружил cwtail, и он хорошо работает (для просмотра лямбда-функции CloudWatch в журналах).
Установить:
npm install -g cwtail
Чтобы вывести список групп журналов:
cwtail -l
Затем, после того, как вы выбрали, какую группу журналов 'tail':
cwtail -f /aws/lambda/ExampleFunction
Поскольку журналы CloudWatch могут задерживаться (т.е. не "в реальном времени" с помощью точного определения), вы анализируете предыдущие события за последнюю временную метку и запускаете следующую итерацию там:
#!/bin/bash
group_name='<log-group-name>'
stream_name='<log-stream-name>'
start_seconds_ago=300
start_time=$(( ( $(date -u +"%s") - $start_seconds_ago ) * 1000 ))
while [[ -n "$start_time" ]]; do
loglines=$( aws --output text logs get-log-events --log-group-name "$group_name" --log-stream-name "$stream_name" --start-time $start_time )
[ $? -ne 0 ] && break
next_start_time=$( sed -nE 's/^EVENTS.([[:digit:]]+).+$/\1/ p' <<< "$loglines" | tail -n1 )
[ -n "$next_start_time" ] && start_time=$(( $next_start_time + 1 ))
echo "$loglines"
sleep 15
done
Или, если вы хотите связать всю группу журналов, используйте filter-log-events
без имени потока:
#!/bin/bash
group_name='<log-group-name>'
start_seconds_ago=300
start_time=$(( ( $(date -u +"%s") - $start_seconds_ago ) * 1000 ))
while [[ -n "$start_time" ]]; do
loglines=$( aws --output text logs filter-log-events --log-group-name "$group_name" --interleaved --start-time $start_time )
[ $? -ne 0 ] && break
next_start_time=$( sed -nE 's/^EVENTS.([^[:blank:]]+).([[:digit:]]+).+$/\2/ p' <<< "$loglines" | tail -n1 )
[ -n "$next_start_time" ] && start_time=$(( $next_start_time + 1 ))
echo "$loglines"
sleep 15
done
Я также использовал сценарии, которые я использую в качестве GitHub gists: https://gist.github.com/tekwiz/964a3a8d2d84ff4c8b5288d9a703fbce.
Предупреждение: приведенный выше код и сценарии написаны для моей системы macOS, которая настроена (подчёркнута??) с помощью Homebrew и GNU coreutils, поэтому для вашей системы могут потребоваться некоторые параметры команды. Редактирование приветствуется:)
Для эффективного ведения журналов CloudWatch я создал инструмент под названием cw.
Он очень прост в установке (поддерживает brew, snap и scoop), быстро (он ориентирован на конкретную аппаратную архитектуру, без промежуточного времени выполнения) и имеет набор функций, которые облегчают жизнь.
Ваш пример с cw будет:
cw tail -f groupName:streamName
Обратите внимание, что отслеживание журнала aws теперь является поддерживаемой функцией официального awscli, хотя и только в awscli v2, которая еще не выпущена. Хвост и следование журналам (например, tail -f
) теперь можно выполнить с помощью чего-то вроде:
aws logs tail $group_name --follow
Чтобы установить версию v2, см. инструкции на этой странице. Это было реализовано в этом PR. Чтобы увидеть это на последней конференции re: Invent, посмотрите это видео.
Помимо отслеживания журналов, он позволяет просматривать журналы заданного времени с помощью параметра --since
, который может занять абсолютное или относительное время
aws logs tail $group_name --since 5d
Чтобы разделить версии awscli v1 и v2, я установил awscli v2 в отдельную виртуальную среду python и активировал ее только тогда, когда мне нужно использовать awscli v2.
Я создал JetBrains плагин под названием awstail, чтобы сделать это:)
Вы можете использовать awslogs, пакет python, чтобы отслеживать журналы aws logwatch.
Установите его с
pip install awslogs
Перечислите все группы с
awslogs groups
Затем выберите поток и смотрите его
awslogs get staging-cluster --watch
Вы также можете отфильтровать журналы с соответствующими шаблонами.
# tail logs of a cluster
awslogs get staging-cluster --watch
# tail logs of a lambda function
awslogs get /aws/lambda/some-service --watch
# print all logs containg "error"
awslogs get staging-cluster --watch --filter-pattern="error"
# print all logs *not* containg "error"
awslogs get staging-cluster --watch --filter-pattern="-error"
Смотрите readme проекта для получения дополнительной информации об использовании awslogs.
В aws cli нет опции "живого хвоста" -f.
Эти другие инструменты, упомянутые выше, предоставляют функцию хвостовика, однако я попробовал все эти инструменты, awslogs, cwtail и нашел их разочаровывающими. Они медленно загружали события, часто были ненадежными и бесполезными при отображении данных журнала JSON и были примитивными с параметрами запросов.
Мне нужен был очень быстрый и простой просмотрщик журналов, который позволил бы мне мгновенно и легко увидеть ошибки и статус приложения. Средство просмотра журналов CloudWatch работает медленно, и CloudWatch Insights может занять> 1 м для некоторых довольно простых запросов.
Поэтому я создал SenseLogs, бесплатную программу просмотра журналов AWS CloudWatch Logs, которая полностью работает в вашем браузере. Не требуется никаких серверных служб. SenseLogs прозрачно загружает данные журнала и сохраняет события в кеше приложения браузера для немедленного просмотра, плавной бесконечной прокрутки и полнотекстовых запросов. У SenseLogs есть живой хвост с бесконечной прокруткой назад. См. Https://github.com/sensedeep/senselogs/blob/master/README.md для получения подробной информации.
Вот скрипт bash, который вы можете использовать. Для сценария требуются интерфейс командной строки AWS и jq.
#!/bin/bash
# Bail out if anything fails, or if we do not have the required variables set
set -o errexit -o nounset
LOG_GROUP_NAME=$1
LOG_BEGIN=$(date --date "${2-now}" +%s)
LOG_END=$(date --date "${3-2 minutes}" +%s)
LOG_INTERVAL=5
LOG_EVENTIDS='[]'
while (( $(date +%s) < $LOG_END + $LOG_INTERVAL )); do
sleep $LOG_INTERVAL
LOG_EVENTS=$(aws logs filter-log-events --log-group-name $LOG_GROUP_NAME --start-time "${LOG_BEGIN}000" --end-time "${LOG_END}000" --output json)
echo "$LOG_EVENTS" | jq -rM --argjson eventIds "$LOG_EVENTIDS" '.events[] as $event | select($eventIds | contains([$event.eventId]) | not) | $event | "\(.timestamp / 1000 | todateiso8601) \(.message)"'
LOG_EVENTIDS=$(echo "$LOG_EVENTS" | jq -crM --argjson eventIds "$LOG_EVENTIDS" '$eventIds + [.events[].eventId] | unique')
done
Использование: сохраните файл, chmod +x
и запустите его: ./cloudwatch-logs-tail.sh log-group-name
. Сценарий также принимает параметры времени начала и окончания, которые по умолчанию равны now
и 2 minutes
соответственно. Вы можете указать любые строки, которые могут быть проанализированы date --date
для этих параметров.
Как это работает: скрипт хранит список идентификаторов событий, которые были отображены, который пуст для начала. Он запрашивает журналы CloudWatch, чтобы получить все записи журнала за указанный интервал времени, и отображает те, которые не соответствуют нашему списку идентификаторов событий. Он сохраняет все идентификаторы событий для следующей итерации.
Сценарий опрашивает каждые несколько секунд (устанавливается LOG_INTERVAL
в сценарии) и продолжает опрашивать еще один интервал после времени окончания, чтобы учесть задержку между получением журнала и доступностью.
Обратите внимание, что этот сценарий не будет хорошим, если вы хотите постоянно отслеживать журналы более чем на несколько минут, потому что результаты запроса, которые он получает от AWS, будут увеличиваться с каждым добавленным элементом журнала. Это хорошо для быстрых пробегов все же.
В настоящее время это не функция CLI, поскольку она просто предоставляет HTTP API для журналов CloudWatch. Вы могли бы тривиально эмулировать функциональность с помощью оболочки script:
#! /bin/sh
end_time=$(($(date +"%s") * 1000))
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --end-time $end_time
while :
do
start_time=$end_time
end_time=$(($(date +"%s") * 1000))
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --start-time $start_time --end-time $end_time
sleep 1
done
Отказ от ответственности: это не будет работать в Windows, и может быть лучший способ получить время в миллисекундах.