Как просмотреть aws-журнал в реальном времени (например, tail -f)

Я могу просмотреть журнал, используя следующую команду.

aws logs get-log-events --log-group-name groupName --log-stream-name streamName --limit 100

что это за команда, чтобы получить функцию вроде tail -f чтобы я мог видеть журнал в реальном времени

Ответ 1

Посмотрите на awslogs.

Если вам довелось работать с Lambda/API Gateway, обратите внимание на apilogs.

Ответ 2

Я был очень разочарован 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 

Увидел это замечательно, потому что вывод легко читается, и вы можете транслировать журналы из всей группы журналов, а не только из одного потока в группе. Фильтрация и просмотр потоков с определенным префиксом также просто!

Ответ 3

Я только что обнаружил cwtail, и он хорошо работает (для просмотра лямбда-функции CloudWatch в журналах).

Установить:

npm install -g cwtail

Чтобы вывести список групп журналов:

cwtail -l

Затем, после того, как вы выбрали, какую группу журналов 'tail':

cwtail -f /aws/lambda/ExampleFunction

Ответ 4

Поскольку журналы 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, поэтому для вашей системы могут потребоваться некоторые параметры команды. Редактирование приветствуется:)

Ответ 5

Для эффективного ведения журналов CloudWatch я создал инструмент под названием cw.

Он очень прост в установке (поддерживает brew, snap и scoop), быстро (он ориентирован на конкретную аппаратную архитектуру, без промежуточного времени выполнения) и имеет набор функций, которые облегчают жизнь.

Ваш пример с cw будет:

cw tail -f groupName:streamName

Ответ 6

Обратите внимание, что отслеживание журнала 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.

Ответ 8

Вы можете использовать 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.

Ответ 9

В 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 для получения подробной информации.

Ответ 10

Вот скрипт 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, будут увеличиваться с каждым добавленным элементом журнала. Это хорошо для быстрых пробегов все же.

Ответ 11

В настоящее время это не функция 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, и может быть лучший способ получить время в миллисекундах.