как просмотреть журнал aws в реальном времени (например, tail-f)
Я могу просмотреть журнал, используя следующую команду.
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --limit 100
какая команда чтобы получить функцию как tail -f
чтобы я мог видеть журнал в реальном времени
6 ответов
Я был очень разочарован с awslogs
и cwtail
поэтому я сделал свой собственный инструмент под названием увидел это эффективно передает журналы 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
Saw отлично, потому что вывод легко читается, и вы можете передавать журналы из всей группы журналов, а не только один поток в группе. Фильтрация и просмотр потоков с определенным префиксом также так же просто!
поскольку журналы 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:]]+).+$// 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:]]+).+$// 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, поэтому некоторые параметры команды могут потребоваться настроить для вашей системы. Правки приветствуются :)
Я только что обнаружил cwtail и он хорошо работает (для просмотра журналов CloudWatch лямбда-функции).
установка:
npm install -g cwtail
чтобы перечислить группы журналов:
cwtail -l
затем, как только вы выбрали, какая группа журналов "хвост":
cwtail -f /aws/lambda/ExampleFunction
в настоящее время это не является функцией CLI, так как он просто предоставляет HTTP API для журналов CloudWatch. Вы можете довольно тривиально эмулировать функциональность с помощью сценария оболочки:
#! /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, и может быть лучший способ получить время в миллисекундах.