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

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

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

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

21 голос | спросил LynAs 1 TueEurope/Moscow2015-12-01T14:10:38+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 14:10:38 +0300 2015, 14:10:38

6 ответов


0

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

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

ответил Tyler Brock 18 J0000006Europe/Moscow 2018, 23:26:15
0

Поскольку журналы 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: https: //gist.github .com /tekwiz /964a3a8d2d84ff4c8b5288d9a703fbce .

Предупреждение: приведенный выше код & Сценарии написаны для моей системы MacOS, которая настраивается (подвергается критике ??) с помощью homebrew и GNU coreutils, поэтому некоторые параметры команды, возможно, придется настроить для вашей системы. Изменения приветствуются:)

ответил Travis Warlick 27 J0000006Europe/Moscow 2016, 15:24:24
0

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

Для установки:

npm install -g cwtail

Чтобы отобразить группы журналов:

cwtail -l

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

cwtail -f /aws/lambda/ExampleFunction
ответил Greg Sadetsky 1 FriEurope/Moscow2017-12-01T22:44:43+03:00Europe/Moscow12bEurope/MoscowFri, 01 Dec 2017 22:44:43 +0300 2017, 22:44:43
0
ответил godzsa 2 MarpmFri, 02 Mar 2018 17:08:57 +03002018-03-02T17:08:57+03:0005 2018, 17:08:57
0

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

ответил ChillarAnand 22 42018vEurope/Moscow11bEurope/MoscowThu, 22 Nov 2018 07:54:12 +0300 2018, 07:54:12
0

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

ответил Jordon Phillips 1 TueEurope/Moscow2015-12-01T21:46:04+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 21:46:04 +0300 2015, 21:46:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132