web-dev-qa-db-fra.com

AWS Cloudwatch Log - Est-il possible d'exporter des données de journal existantes?

J'ai réussi à envoyer le journal de mes applications vers AWS Cloudwatch à l'aide de l'agent de journal AWS CloudWatch. Mais la console Web ColudWatch ne semble pas fournir de bouton pour vous permettre de télécharger/exporter les données du journal depuis celle-ci. 

Des idées comment je peux atteindre cet objectif?

27
xwk

La dernière version de l'AWS CLI dispose d'une cli CloudWatch Logs, qui vous permet de télécharger les journaux au format JSON, fichier texte ou toute autre sortie prise en charge par AWS CLI.

Par exemple, pour obtenir les 10 000 premières entrées de journal du flux a du groupe A dans un fichier texte, exécutez:

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 demande. Si vous en avez plus, vous devez implémenter votre propre mécanisme de progression de page à l'aide du paramètre --next-token. J'espère qu'à l'avenir, la CLI autorisera également le vidage complet dans une seule commande.

Mettre à jour

Voici un petit script Bash pour répertorier les événements de tous les flux d'un groupe spécifique, à une heure donné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 définissez TAIL, continuera à extraire les événements de journal et signalera les événements les plus récents au fur et à mesure de leur arrivée (avec un certain délai).

32
Guss

Il existe également un projet python appelé awslogs, permettant d’obtenir les journaux: https://github.com/jorgebastida/awslogs

Il y a des choses comme:

liste des groupes de journaux:

$ awslogs groups

liste les flux pour un groupe de journaux donné:

$ awslogs streams /var/log/syslog

obtenir les enregistrements du journal de tous les flux:

$ awslogs get /var/log/syslog

obtenir les enregistrements du journal à partir d'un flux spécifique:

$ awslogs get /var/log/syslog stream_A

et bien plus encore (filtrage par période, surveillance des flux de journaux ...

Je pense que cet outil pourrait vous aider à faire ce que vous voulez.

17
Jan Vlcinsky

Il semble qu'AWS ait ajouté la possibilité d'exporter tout un groupe de journaux vers S3.

 Export to S3 menu

 Export to S3 Form

Vous devez configurer des autorisations sur le compartiment S3 pour permettre à cloudwatch d'écrire dans le compartiment en ajoutant les éléments suivants à votre stratégie de compartiment, en remplaçant la région par votre région et le nom du compartiment par votre nom de compartiment.

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

Les détails peuvent être trouvés dans Étape 2 de ce document AWS

5
Josh Vickery

Apparemment, AWS Console ne contient pas de solution prête à l'emploi permettant de télécharger CloudWatchLogs. Peut-être pouvez-vous écrire un script pour effectuer l'extraction CloudWatchLogs à l'aide du SDK/API. 

La bonne chose à propos de CloudWatchLogs est que vous pouvez conserver les journaux pendant une durée infinie (Never Expire); contrairement à CloudWatch, qui conserve les journaux pendant 14 jours seulement. Ce qui signifie que vous pouvez exécuter le script à une fréquence mensuelle/trimestrielle plutôt qu’à la demande.

Pour plus d'informations sur l'API CloudWatchLogs, http://docs.aws.Amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.htmlhttp: //awsdocs.s3 .amazonaws.com/cloudwatchlogs/latest/cwl-api.pdf

2
Naveen Vijay

J'ajouterais cette doublure pour obtenir tous les journaux d'un flux:

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, certes moins puissant que @ Guss, mais assez simple. Je l'ai enregistré en tant que getLogs.sh et l'invoque avec ./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}"
0
Johnride