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?

22
demandé sur xwk 2015-01-21 09:24:21

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).

20
répondu Guss 2018-04-10 13:30:32

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.

14
répondu Jan Vlcinsky 2015-11-09 22:25:41

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

2
répondu Naveen Vijay 2015-01-21 07:30:22

il semble que AWS a ajouté la possibilité d'exporter un groupe de log entier vers S3.

Export to S3 menu

Export to S3 Form

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

0
répondu Josh Vickery 2017-08-30 21:18:57

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}"
0
répondu Johnride 2018-04-26 17:48:27