logs cloudwatch cli aws amazon-web-services amazon-cloudwatch

amazon web services - cli - AWS Cloudwatch Log-¿Es posible exportar los datos de registro existentes desde allí?



aws download cloudwatch logs (5)

Logré enviar el registro de mi aplicación a AWS Cloudwatch utilizando el agente de registro de AWS CloudWatch. Pero la consola web de ColudWatch no parece proporcionar un botón que le permita descargar / exportar los datos de registro desde ella.

¿Alguna idea de cómo puedo lograr este objetivo?


Aparentemente, no hay una forma de salida desde la consola de AWS desde donde puede descargar los CloudWatchLogs. Quizás pueda escribir un script para realizar la búsqueda de CloudWatchLogs utilizando el SDK / API.

Lo bueno de CloudWatchLogs es que puede retener los registros durante un tiempo infinito (nunca caduque); a diferencia del CloudWatch que solo mantiene los registros por solo 14 días. Lo que significa que puede ejecutar el script en una frecuencia mensual / trimestral en lugar de bajo demanda.

Más información sobre la API de CloudWatchLogs, http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html http://awsdocs.s3.amazonaws.com/cloudwatchlogs/latest/cwl-api.pdf


La última versión de AWS CLI tiene un cli de CloudWatch Logs, que le permite descargar los registros como JSON, archivos de texto o cualquier otra salida compatible con AWS CLI.

Por ejemplo, para obtener las primeras 10.000 entradas de registro de la secuencia en el grupo A en un archivo de texto, ejecute:

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

Actualmente, el comando está limitado a un máximo de 10,000 registros por solicitud y, si tiene más, necesita implementar su propio mecanismo de pasos de página utilizando el parámetro --next-token . Espero que en el futuro la CLI también permita el volcado completo en un solo comando.

Actualizar

Aquí hay un pequeño script Bash para enumerar los eventos de todas las secuencias en un grupo específico, desde un tiempo específico:

#!/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

En la última parte, si configura TAIL continuará obteniendo eventos de registro e informará eventos más nuevos a medida que se presenten (con un retraso esperado).


Me gustaría agregar ese forro para obtener todos los registros de una secuencia:

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

O en un formato un poco más legible:

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

Y puedes hacer un guión práctico que sea menos poderoso que el de @ Guss pero que sea lo suficientemente simple. Lo getLogs.sh como getLogs.sh y lo invoco con ./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}"


Parece que AWS ha agregado la capacidad de exportar un grupo de registro completo a S3.

Deberá configurar permisos en el grupo S3 para permitir que Cloudwatch escriba en el grupo agregando lo siguiente a su política de grupo, reemplazando la región con su región y el nombre del grupo con el nombre de su grupo.

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

Los detalles se pueden encontrar en el Paso 2 de este documento de AWS.


También hay un proyecto de python llamado awslogs , que permite obtener los registros: https://github.com/jorgebastida/awslogs

Hay cosas como:

lista de grupos de registro:

$ awslogs groups

listar secuencias para el grupo de registro dado:

$ awslogs streams /var/log/syslog

obtener los registros de registro de todas las corrientes:

$ awslogs get /var/log/syslog

obtener los registros de registro de flujo específico:

$ awslogs get /var/log/syslog stream_A

y mucho más (filtrar por período de tiempo, ver secuencias de registro ...

Creo que esta herramienta podría ayudarte a hacer lo que quieres.