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}"