AWS Cloudwatch Log - возможно ли экспортировать из него существующие данные журнала?

Мне удалось отправить журналы приложений в AWS Cloudwatch с помощью агента журналов AWS CloudWatch. Но веб-консоль CloudWatch, по-видимому, не предоставляет кнопку, позволяющую загружать/экспортировать из нее данные журнала.

Есть идеи, как мне достичь этой цели?

Ответы

Ответ 1

Последний CLI AWS имеет CliWatch Logs cli, что позволяет загружать журналы в виде JSON, текстового файла или любого другого вывода, поддерживаемого AWS CLI.

Например, чтобы получить первые 10000 записей журнала из потока a в группе A в текстовый файл, выполните:

aws logs get-log-events \
   --log-group-name A --log-stream-name a \
   --output text > a.log

Команда в настоящее время ограничена максимум 10 000 записей на запрос, и если у вас есть больше, вам нужно реализовать свой собственный механизм --next-token страницы с помощью параметра --next-token. Я ожидаю, что в будущем CLI также разрешит полный дамп в одной команде.

Обновить

Вот небольшой скрипт Bash для отображения событий из всех потоков в определенной группе, начиная с указанного времени:

#!/bin/bash
function dumpstreams() {
  aws $AWSARGS logs describe-log-streams \
    --order-by LastEventTime --log-group-name $LOGGROUP \
    --output text | while read -a st; do 
      [ "${st[4]}" -lt "$starttime" ] && continue
      stname="${st[1]}"
      echo ${stname##*:}
    done | while read stream; do
      aws $AWSARGS logs get-log-events \
        --start-from-head --start-time $starttime \
        --log-group-name $LOGGROUP --log-stream-name $stream --output text
    done
}

AWSARGS="--profile myprofile --region us-east-1"
LOGGROUP="some-log-group"
TAIL=
starttime=$(date --date "-1 week" +%s)000
nexttime=$(date +%s)000
dumpstreams
if [ -n "$TAIL" ]; then
  while true; do
    starttime=$nexttime
    nexttime=$(date +%s)000
    sleep 1
    dumpstreams
  done
fi

Последняя часть, если вы установите TAIL, продолжит извлекать события журнала и будет сообщать о новых событиях по мере их поступления (с некоторой ожидаемой задержкой).

Ответ 2

Существует также проект python под названием awslogs, позволяющий получить журналы: https://github.com/jorgebastida/awslogs

Есть такие вещи, как:

список групп журналов:

$ awslogs groups

список потоков для данной группы журналов:

$ awslogs streams /var/log/syslog

получить записи журнала из всех потоков:

$ awslogs get /var/log/syslog

получить записи журнала из определенного потока:

$ awslogs get /var/log/syslog stream_A

и многое другое (фильтрация за период времени, просмотр журнальных потоков...

Я думаю, этот инструмент может помочь вам сделать то, что вы хотите.

Ответ 3

Похоже, в AWS добавлена возможность экспорта всей группы журналов в S3.

Export to S3 menu

Export to S3 Form

Вам нужно будет настроить разрешения для корзины S3, чтобы позволить облачным часам записывать в корзину, добавив следующее в свою политику сегментов, заменив регион вашим регионом, а имя сегмента именем вашего сегмента.

    {
        "Effect": "Allow",
        "Principal": {
            "Service": "logs.us-east-1.amazonaws.com"
        },
        "Action": "s3:GetBucketAcl",
        "Resource": "arn:aws:s3:::tsf-log-data"
    },
    {
        "Effect": "Allow",
        "Principal": {
            "Service": "logs.us-east-1.amazonaws.com"
        },
        "Action": "s3:PutObject",
        "Resource": "arn:aws:s3:::tsf-log-data/*",
        "Condition": {
            "StringEquals": {
                "s3:x-amz-acl": "bucket-owner-full-control"
            }
        }
    }

Подробности можно найти в шаге 2 этого документа AWS

Ответ 4

По-видимому, из Консоли AWS нет выхода из коробки, где вы можете загрузить CloudWatchLogs. Возможно, вы можете написать script для выполнения выборки CloudWatchLogs с помощью SDK/API.

Хорошая вещь о CloudWatchLogs заключается в том, что вы можете сохранять журналы в течение бесконечного времени (Never Expire); в отличие от CloudWatch, который просто хранит журналы всего за 14 дней. Это означает, что вы можете запускать script ежемесячно/ежеквартально, а не по требованию.

Дополнительная информация о API CloudWatchLogs, http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html http://awsdocs.s3.amazonaws.com/cloudwatchlogs/latest/cwl-api.pdf

Ответ 5

Я бы добавил, что один лайнер, чтобы получить все журналы для потока:

aws logs get-log-events --log-group-name my-log-group --log-stream-name my-log-stream | grep '"message":' | awk -F '"' '{ print $(NF-1) }' > my-log-group_my-log-stream.txt

Или в чуть более читаемом формате:

aws logs get-log-events \
    --log-group-name my-log-group\
    --log-stream-name my-log-stream \
    | grep '"message":' \
    | awk -F '"' '{ print $(NF-1) }' \
    > my-log-group_my-log-stream.txt

И вы можете сделать из него удобный скрипт, который, по общему признанию, менее мощный, чем @Guss, но достаточно простой. Я сохранил его как getLogs.sh и getLogs.sh его с помощью ./getLogs.sh log-group log-stream

#!/bin/bash

if [[ "${#}" != 2 ]]
then
    echo "This script requires two arguments!"
    echo
    echo "Usage :"
    echo "${0} <log-group-name> <log-stream-name>"
    echo
    echo "Example :"
    echo "${0} my-log-group my-log-stream"

    exit 1
fi

OUTPUT_FILE="${1}_${2}.log"
aws logs get-log-events \
    --log-group-name "${1}"\
    --log-stream-name "${2}" \
    | grep '"message":' \
    | awk -F '"' '{ print $(NF-1) }' \
    > "${OUTPUT_FILE}"

echo "Logs stored in ${OUTPUT_FILE}"