AWS Cloudwatch Log - est-ce possible d'exporter les données existantes?
j'ai réussi à pousser mon journal d'application vers AWS Cloudwatch en utilisant L'agent AWS CloudWatch log. Mais la console Web de ColudWatch ne semble pas fournir de bouton pour vous permettre de télécharger/exporter les données de journal à partir de celui-ci.
des idées pour atteindre cet objectif?
5 réponses
le dernier CLI AWS dispose d'un cli CloudWatch, qui vous permet de télécharger les journaux sous forme de JSON, de fichier texte ou de toute autre sortie prise en charge par le CLI AWS.
par exemple, Pour obtenir les premiers 10 000 entrées de journal à partir du flux a
dans le groupe A
pour un fichier texte, exécuter:
aws logs get-log-events --log-group-name A --log-stream-name a \
--output text > a.log
la commande est actuellement limitée à un maximum de 10.000 enregistrements par requête, et si vous en avez plus vous devez implémenter votre propre mécanisme de pas de page en utilisant le --next-token
paramètre. Je attendre à l'avenir à la CLI permettra également de vidage complet en une seule commande.
mise à Jour
voici un petit script Bash pour lister les événements de tous les flux dans un groupe spécifique, depuis une heure spécifiée:
#!/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
cette dernière partie, si vous mettez TAIL
va continuer à extraire des journaux d'événements et rapports récents événements comme ils viennent dans (avec un certain retard).
il y a aussi un projet python appelé awslogs
, permettant d'obtenir les logs:https://github.com/jorgebastida/awslogs
Il y a des choses comme:
journal de liste des groupes:
$ awslogs groups
liste de flux pour les journaux du groupe:
$ awslogs streams /var/log/syslog
obtenir les enregistrements du journal de tous les flux:
$ awslogs get /var/log/syslog
obtenir les enregistrements du journal de flux spécifique :
$ awslogs get /var/log/syslog stream_A
et beaucoup plus (filtrage pour la période de temps, regarder le journal flux...
je pense que cet outil pourrait vous aider à faire ce que vous voulez.
apparemment, il n'y a pas de sortie standard depuis la Console AWS où vous pouvez télécharger les CloudWatchLogs. Peut-être Pouvez-vous écrire un script pour exécuter le fetch de CloudWatchLogs en utilisant le SDK / API.
la bonne chose à propos de CloudWatchLogs est que vous pouvez conserver les journaux pour un temps infini(jamais expirer); contrairement au CloudWatch qui garde juste les journaux pour seulement 14 jours. Ce qui signifie que vous pouvez exécuter le script en fréquence mensuelle / trimestrielle plutôt qu'à la demande.
Plus informations sur L'API CloudWatchLogs, http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html http://awsdocs.s3.amazonaws.com/cloudwatchlogs/latest/cwl-api.pdf
il semble que AWS a ajouté la possibilité d'exporter un groupe de log entier vers S3.
vous aurez besoin de configurer les permissions sur le seau S3 pour permettre à cloudwatch d'écrire sur le seau en ajoutant ce qui suit à votre politique de seau, en remplaçant la région par votre région et le nom du seau par votre nom de seau.
{
"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"
}
}
}
plus de Détails peuvent être trouvés dans Étape 2 de ceci AWS doc
je voudrais ajouter qu'un liner pour obtenir tous les journaux pour un flux de données :
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
ou dans un format légèrement plus lisible:
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
et vous pouvez en faire un script pratique qui est certes moins puissant que @Gusss mais assez simple. Je l'ai enregistré en tant que getLogs.sh
et l'invoquer à l' ./getLogs.sh log-group log-stream
#!/bin/bash
if [[ "${#}" != 2 ]]
then
echo "This script requires two arguments!"
echo
echo "Usage :"
echo " <log-group-name> <log-stream-name>"
echo
echo "Example :"
echo " my-log-group my-log-stream"
exit 1
fi
OUTPUT_FILE="_.log"
aws logs get-log-events \
--log-group-name ""\
--log-stream-name "" \
| grep '"message":' \
| awk -F '"' '{ print $(NF-1) }' \
> "${OUTPUT_FILE}"
echo "Logs stored in ${OUTPUT_FILE}"