2015-12-01 17 views

risposta

4

Dai un'occhiata allo awslogs.

Se si sta lavorando specificamente con Lambda/API Gateway, dare un'occhiata a apilogs.

+0

Il pacchetto 'awslogs' è fantastico. Risolto un problema che ho avuto questa mattina in cui un membro del team aziendale voleva semplicemente "fare il grep dei log per trovare le cose". Sicuramente la strada da percorrere per soluzioni semplici. –

1

questo momento non è una caratteristica del CLI poiché solo espone l'API HTTP per CloudWatch Logs. Si potrebbe piuttosto banalmente emulare la funzionalità con uno script di shell:

#! /bin/sh 

end_time=$(($(date +"%s") * 1000)) 
aws logs get-log-events --log-group-name groupName --log-stream-name streamName --end-time $end_time 

while : 
do 
    start_time=$end_time 
    end_time=$(($(date +"%s") * 1000)) 
    aws logs get-log-events --log-group-name groupName --log-stream-name streamName --start-time $start_time --end-time $end_time 
    sleep 1 
done 

Esonero di responsabilità: questo non funzionerà su Windows, e ci potrebbe essere un modo migliore per ottenere il tempo in millisecondi.

+0

Grazie per la risposta. Ha aiutato, ma questo lavoro per me dal momento del server e il mio tempo macchina locale è diverso. Ho provato a cambiare la mia ora locale, ma ancora non si sincronizzerà correttamente. – LynAs

+0

I registri di CloudWatch vengono archiviati con il fuso orario e l'API CloudWatch utilizza UTC per i timestamp (epoca UNIX in millisecondi), quindi in questo modo si ottengono solo eventi nel passato se il sistema utilizza un fuso orario a est di GMT (e nulla se si a ovest del GMT). Inoltre, i registri di CloudWatch sono quasi sempre ritardati di un paio di secondi, quindi la probabilità che ciò restituisca gli eventi anche se si corregge il tempo di UTC è piuttosto bassa (nella mia esperienza). –

5

Perché i registri CloudWatch possono essere ritardati (cioè non "in tempo reale" di una precisa definizione) si analizza gli eventi precedenti per l'ultima ora e data e avvia l'iterazione successiva c'è:

#!/bin/bash 

group_name='<log-group-name>' 
stream_name='<log-stream-name>' 
start_seconds_ago=300 

start_time=$((($(date -u +"%s") - $start_seconds_ago) * 1000)) 
while [[ -n "$start_time" ]]; do 
    loglines=$(aws --output text logs get-log-events --log-group-name "$group_name" --log-stream-name "$stream_name" --start-time $start_time) 
    [ $? -ne 0 ] && break 
    next_start_time=$(sed -nE 's/^EVENTS.([[:digit:]]+).+$/\1/ p' <<< "$loglines" | tail -n1) 
    [ -n "$next_start_time" ] && start_time=$(($next_start_time + 1)) 
    echo "$loglines" 
    sleep 15 
done 

Oppure, se si desidera la coda di un tutto il gruppo di registro, utilizzare filter-log-events senza un nome di flusso:

#!/bin/bash 

group_name='<log-group-name>' 
start_seconds_ago=300 

start_time=$((($(date -u +"%s") - $start_seconds_ago) * 1000)) 
while [[ -n "$start_time" ]]; do 
    loglines=$(aws --output text logs filter-log-events --log-group-name "$group_name" --interleaved --start-time $start_time) 
    [ $? -ne 0 ] && break 
    next_start_time=$(sed -nE 's/^EVENTS.([^[:blank:]]+).([[:digit:]]+).+$/\2/ p' <<< "$loglines" | tail -n1) 
    [ -n "$next_start_time" ] && start_time=$(($next_start_time + 1)) 
    echo "$loglines" 
    sleep 15 
done 

ho anche messo gli script che uso come GIST GitHub: https://gist.github.com/tekwiz/964a3a8d2d84ff4c8b5288d9a703fbce.

Attenzione: il codice sopra riportato & script sono scritti per il mio sistema macOS che è personalizzato (bastardizzato ??) con coreutils Homebrew e GNU, quindi alcune opzioni di comando potrebbero dover essere ottimizzate per il sistema. Le modifiche sono benvenute :)

3

Ho appena scoperto cwtail e funziona bene (per osservare i registri di CloudWatch di una funzione lambda).

Per installare:

npm install -g cwtail 

Per elencare i gruppi di registro:

cwtail -l 

Poi, una volta che hai scelto, che di registro del gruppo a 'coda':

cwtail -f /aws/lambda/ExampleFunction 
Problemi correlati