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

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

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

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

6 ответов


посмотреть awslogs.

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


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

Я создал JetBrains плагин называется awstail для этого :)


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