Registrare e monitorare funzioni Lambda in Node.js - AWS Lambda

Registrare e monitorare funzioni Lambda in Node.js

AWS Lambda monitora automaticamente le funzioni Lambda per tuo conto e invia i log ad Amazon CloudWatch. La funzione Lambda viene fornita con un gruppo di log CloudWatch Logs con un flusso di log per ogni istanza della funzione. L'ambiente del runtime Lambda invia i dettagli su ogni richiamo al flusso di log e inoltra i log e l'output del codice della funzione. Per ulteriori informazioni, consulta Lambda invia automaticamente i log delle funzioni a CloudWatch Logs..

In questa pagina viene descritto come produrre l'output del log dal codice della funzione Lambda e dai log di accesso utilizzando AWS Command Line Interface, la console Lambda o la console CloudWatch.

Creazione di una funzione che restituisce i registri

Per generare i log dal codice della funzione, è possibile utilizzare i metodi dell'oggetto console o di qualsiasi libreria di registrazione che scriva su stdout o stderr. L'esempio seguente registra i valori delle variabili di ambiente e l'oggetto evento.

Nota

Si consiglia di utilizzare tecniche come la convalida dell'input e la codifica dell'output durante la registrazione degli input. Se registri direttamente i dati di input, un utente malintenzionato potrebbe essere in grado di utilizzare il codice per rendere difficile l'individuazione delle manomissioni, falsificare le voci di log o aggirare i monitor dei log. Per ulteriori informazioni, consulta Neutralizzazione di output non corretta per i log in Enumerazione delle debolezze comuni.

Esempio File index.js – Registrazione dei log
exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.info("EVENT\n" + JSON.stringify(event, null, 2)) console.warn("Event not processed.") return context.logStreamName }
Esempio Formato dei log
START RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac Version: $LATEST
2019-06-07T19:11:20.562Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	INFO	ENVIRONMENT VARIABLES
{
  "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST",
  "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/my-function",
  "AWS_LAMBDA_LOG_STREAM_NAME": "2019/06/07/[$LATEST]e6f4a0c4241adcd70c262d34c0bbc85c",
  "AWS_EXECUTION_ENV": "AWS_Lambda_nodejs12.x",
  "AWS_LAMBDA_FUNCTION_NAME": "my-function",
  "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
  "NODE_PATH": "/opt/nodejs/node10/node_modules:/opt/nodejs/node_modules:/var/runtime/node_modules",
  ...
}
2019-06-07T19:11:20.563Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	INFO	EVENT
{
  "key": "value"
}
2019-06-07T19:11:20.564Z	c793869b-ee49-115b-a5b6-4fd21e8dedac	WARN	Event not processed.
END RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac
REPORT RequestId: c793869b-ee49-115b-a5b6-4fd21e8dedac	Duration: 128.83 ms	Billed Duration: 296 ms	Memory Size: 128 MB	Max Memory Used: 74 MB	Init Duration: 166.62 ms	XRAY TraceId: 1-5d9d007f-0a8c7fd02xmpl480aed55ef0	SegmentId: 3d752xmpl1bbe37e	Sampled: true

Il runtime di Node.js registra le voci START, END e REPORT per ogni chiamata. A ogni voce registrata dalla funzione aggiunge un timestamp, l'ID della richiesta e il livello di log. La riga del report fornisce i seguenti dettagli.

Campi dati della riga REPORT
  • RequestID – L'ID della richiesta univoco per la chiamata.

  • Durata – La quantità di tempo che il metodo del gestore della funzione impiega durante l'elaborazione dell'evento.

  • Durata fatturata – La quantità di tempo fatturata per la chiamata.

  • Dimensioni memoria – La quantità di memoria allocata per la funzione.

  • Quantità max utilizzata – La quantità di memoria utilizzata dalla funzione. Quando le invocazioni condividono un ambiente di esecuzione, Lambda riporta la memoria massima utilizzata in tutte le invocazioni. Questo comportamento potrebbe comportare un valore riportato superiore al previsto.

  • Durata Init – Per la prima richiesta servita, la quantità di tempo impiegato dal runtime per caricare la funzione ed eseguire il codice al di fuori del metodo del gestore.

  • XRAY TraceId – Per le richieste tracciate, l'ID di traccia AWS X-Ray.

  • SegmentId – Per le richieste tracciate, l'ID segmento X-Ray.

  • Campionato – Per le richieste tracciate, il risultato del campionamento.

Puoi visualizzare i log nella console Lambda, nella console di log CloudWatch o dalla riga di comando.

Utilizzo dei controlli di registrazione avanzati di Lambda con Node.js

Per avere un maggiore controllo sul modo in cui i log delle tue funzioni vengono acquisiti, elaborati e utilizzati, puoi configurare le seguenti opzioni di registrazione per i runtime Node.js supportati:

  • Formato di log: scegli tra i formati di testo normale e JSON strutturato per i log della funzione

  • Livello di log: per i log in formato JSON, scegli il livello di dettaglio dei log che Lambda invia ad Amazon CloudWatch, come ERROR, DEBUG o INFO

  • Gruppo di log: scegli il gruppo di log di CloudWatch a cui la funzione invia i log

Per ulteriori informazioni su queste opzioni di registrazione e istruzioni su come configurare la funzione per utilizzarle, consulta la pagina Configurazione dei controlli di registrazione avanzati per le funzioni Lambda.

Per utilizzare le opzioni del formato di log e del livello di log con le funzioni Lambda in Node.js, consulta le istruzioni nelle sezioni seguenti.

Utilizzo di log JSON strutturati con Node.js

Se si seleziona JSON per il formato di log della funzione, Lambda invierà gli output log a CloudWatch utilizzando i metodi della console console.trace, console.debug, console.log, console.info, console.error e console.warn come JSON strutturati. Ogni oggetto di log JSON contiene almeno quattro coppie chiave-valore con le seguenti chiavi:

  • "timestamp": l'ora in cui è stato generato il messaggio di log

  • "level": il livello di log assegnato al messaggio

  • "message": il contenuto del messaggio di log

  • "requestId": l'ID di richiesta univoco dell'invocazione alla funzione

A seconda del metodo di registrazione di log utilizzato dalla funzione, questo oggetto JSON può anche contenere coppie di chiavi aggiuntive. Ad esempio, se la funzione utilizza metodi della console per registrare i log degli oggetti di errore con più argomenti, l'oggetto JSON conterrà coppie chiave-valore aggiuntive con le chiavi errorMessage, errorType e stackTrace.

Se il codice utilizza già un'altra libreria di registrazione, come ad esempio Powertools per AWS Lambda, per generare log strutturati JSON, non è necessario apportare alcuna modifica. Lambda non codifica due volte i log che sono già codificati in JSON, quindi i log delle applicazioni della funzione continueranno a essere acquisiti come prima.

Per ulteriori informazioni sull'utilizzo del pacchetto di registrazione Powertools per AWS Lambda per creare log JSON strutturati nel runtime Node.js, consulta la pagina Registrare e monitorare le funzioni Lambda con TypeScript.

Esempi di output di log in formato JSON

Gli esempi seguenti mostrano come i vari output di log generati utilizzando i metodi della console con argomenti singoli e multipli vengono acquisiti in File di log CloudWatch quando imposti il formato di log della funzione su JSON.

Il primo esempio utilizza il metodo console.error per generare una stringa semplice.

Esempio Codice di registrazione di Node.js
export const handler = async (event) => { console.error("This is a warning message"); ... }
Esempio Record di log JSON
{ "timestamp":"2025-11-01T00:21:51.358Z", "level":"ERROR", "message":"This is a warning message", "requestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f" }

Con i metodi della console, puoi anche generare messaggi di log strutturati più complessi utilizzando argomenti singoli o multipli. Nel prossimo esempio, viene utilizzato console.log per generare due coppie chiave-valore con un singolo argomento. Tieni presente che il campo "message" nell'oggetto JSON che Lambda invia a File di log CloudWatch non è reso in formato stringa.

Esempio Codice di registrazione di Node.js
export const handler = async (event) => { console.log({data: 12.3, flag: false}); ... }
Esempio Record di log JSON
{ "timestamp": "2025-12-08T23:21:04.664Z", "level": "INFO", "requestId": "405a4537-9226-4216-ac59-64381ec8654a", "message": { "data": 12.3, "flag": false } }

Nel prossimo esempio, viene utilizzato ancora una volta il metodo console.log per creare un output di log. Nella fattispecie, il metodo richiede due argomenti, una mappa contenente due coppie chiave-valore e una stringa identificativa. Tieni presente che in questo caso, poiché hai fornito due argomenti, Lambda rende il campo "message" in formato stringa.

Esempio Codice di registrazione di Node.js
export const handler = async (event) => { console.log('Some object - ', {data: 12.3, flag: false}); ... }
Esempio Record di log JSON
{ "timestamp": "2025-12-08T23:21:04.664Z", "level": "INFO", "requestId": "405a4537-9226-4216-ac59-64381ec8654a", "message": "Some object - { data: 12.3, flag: false }" }

Lambda assegna gli output generati utilizzando il livello di log INFO della console.log.

L'ultimo esempio mostra come gli oggetti di errore possono essere inviati come output a File di log CloudWatch utilizzando i metodi della console. Tieni presente che quando esegui il log di oggetti di errore utilizzando più argomenti, Lambda aggiunge i campi errorMessage, errorType e stackTrace all'output del log.

Esempio Codice di registrazione di Node.js
export const handler = async (event) => { let e1 = new ReferenceError("some reference error"); let e2 = new SyntaxError("some syntax error"); console.log(e1); console.log("errors logged - ", e1, e2); };
Esempio Record di log JSON
{ "timestamp": "2025-12-08T23:21:04.632Z", "level": "INFO", "requestId": "405a4537-9226-4216-ac59-64381ec8654a", "message": { "errorType": "ReferenceError", "errorMessage": "some reference error", "stackTrace": [ "ReferenceError: some reference error", " at Runtime.handler (file:///var/task/index.mjs:3:12)", " at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)" ] } } { "timestamp": "2025-12-08T23:21:04.646Z", "level": "INFO", "requestId": "405a4537-9226-4216-ac59-64381ec8654a", "message": "errors logged - ReferenceError: some reference error\n at Runtime.handler (file:///var/task/index.mjs:3:12)\n at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29) SyntaxError: some syntax error\n at Runtime.handler (file:///var/task/index.mjs:4:12)\n at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)", "errorType": "ReferenceError", "errorMessage": "some reference error", "stackTrace": [ "ReferenceError: some reference error", " at Runtime.handler (file:///var/task/index.mjs:3:12)", " at Runtime.handleOnceNonStreaming (file:///var/runtime/index.mjs:1173:29)" ] }

Quando si registrano i log di più tipi di errore, i campi aggiuntivi errorMessage, errorType e stackTrace vengono estratti dal primo tipo di errore fornito al metodo della console.

Utilizzo di librerie client formato del parametro incorporato (EMF) con log JSON strutturati

AWS fornisce librerie client open source per Node.js che puoi utilizzare per creare log in formato del parametro incorporato (EMF). Se disponi di funzioni esistenti che utilizzano queste librerie e modifichi il formato di log della funzione in JSON, CloudWatch potrebbe non riconoscere più i parametri emessi dal codice.

Se attualmente il codice emette i log EMF direttamente utilizzando console.log o utilizzando Powertools per (AWS LambdaTypeScript), CloudWatch non sarà in grado di analizzarli anche se modifichi il formato di log della funzione in JSON.

Importante

Per garantire che i log EMF delle tue funzioni continuino a essere analizzati correttamente da CloudWatch, aggiorna le librerie EMF e Powertools per AWS Lambda alle versioni più recenti. Se passi al formato di log JSON, ti consigliamo di eseguire dei test anche per garantire la compatibilità con i parametri incorporati della tua funzione. Se il tuo codice emette i log EMF direttamente utilizzando console.log, modifica il codice in modo che emetta tali parametri direttamente a stdout, come mostrato nel seguente esempio di codice.

Esempio codice che emette parametri incorporati a stdout
process.stdout.write(JSON.stringify( { "_aws": { "Timestamp": Date.now(), "CloudWatchMetrics": [{ "Namespace": "lambda-function-metrics", "Dimensions": [["functionVersion"]], "Metrics": [{ "Name": "time", "Unit": "Milliseconds", "StorageResolution": 60 }] }] }, "functionVersion": "$LATEST", "time": 100, "requestId": context.awsRequestId } ) + "\n")

Utilizzo del filtraggio a livello di log con Node.js

Affinché AWS Lambda filtri i log delle applicazioni in base al relativo livello di log, la funzione deve utilizzare i log in formato JSON. Puoi farlo in due modi:

  • Crea output log utilizzando i metodi standard della console e configura la funzione per utilizzare la formattazione dei log JSON. Successivamente, AWS Lambda filtra gli output log utilizzando la coppia chiave-valore "livello" nell'oggetto JSON descritto in Utilizzo di log JSON strutturati con Node.js. Per informazioni su come configurare il formato di log della funzione, consulta la pagina Configurazione dei controlli di registrazione avanzati per le funzioni Lambda.

  • Utilizza un'altra libreria o metodo di registrazione per creare nel codice dei log JSON strutturati che includono una coppia chiave-valore "livello" che definisce il livello dell'output log. Ad esempio, puoi utilizzare Powertools per AWS Lambda per generare output log JSON strutturati dal tuo codice. Per ulteriori informazioni sull'utilizzo di Powertools con il runtime Node.js, consulta la pagina Registrare e monitorare le funzioni Lambda con TypeScript.

    Per consentire a Lambda di filtrare i log della funzione, è necessario includere anche una coppia chiave-valore "timestamp" nell'output log JSON. L'ora deve essere specificata in un formato di timestamp RFC 3339 valido. Se non fornisci un timestamp valido, Lambda assegnerà al log il livello INFO e aggiungerà un timestamp per tuo conto.

Quando configuri la funzione per utilizzare il filtraggio a livello di log, selezioni il livello di log che desideri che AWS Lambda invii a File di log CloudWatch tra le opzioni seguenti:

Livello di log Utilizzo standard
TRACE (dettaglio massimo) Le informazioni più dettagliate utilizzate per tracciare il percorso di esecuzione del codice
DEBUG Informazioni dettagliate per il debug del sistema
INFO Messaggi che registrano il normale funzionamento della funzione
WARN Messaggi relativi a potenziali errori che possono portare a comportamenti imprevisti se non risolti
ERRORE Messaggi relativi a problemi che impediscono al codice di funzionare come previsto
FATAL (dettaglio minimo) Messaggi relativi a errori gravi che causano l'interruzione del funzionamento dell'applicazione

Lambda invia a CloudWatch i log del livello selezionato e di livello inferiore. Ad esempio, se configuri un livello di log WARN, Lambda invierà i log corrispondenti ai livelli WARN, ERROR e FATAL.

Visualizzazione dei log nella console Lambda

È possibile utilizzare la console Lambda per visualizzare l'output del log dopo aver richiamato una funzione Lambda.

Se il codice può essere testato dall'editor del codice incorporato, troverai i log nei risultati dell’esecuzione. Quando utilizzi la funzionalità di test della console per richiamare una funzione, troverai l’output del log nella sezione Dettagli.

Visualizzazione dei registri nella console CloudWatch

È possibile utilizzare la console Amazon CloudWatch per visualizzare i registri per tutti i richiami della funzione Lambda.

Per visualizzare i log nella console CloudWatch:
  1. Aprire la pagina Log groups (Gruppi di log) nella console di CloudWatch.

  2. Scegliere il gruppo di log della funzione (/aws/lambda/function-name).

  3. Creare un flusso di log.

Ogni flusso di log corrisponde a un'istanza della funzione. Nuovi flussi di log vengono visualizzati quando aggiorni la funzione Lambda e quando vengono create istanze aggiuntive per gestire più chiamate simultanee. Per trovare i registri per un richiamo specifico, si consiglia di utilizzare la funzione con AWS X-Ray. X-Ray registra i dettagli sulla richiesta e il flusso di log nella traccia.

Visualizzazione dei log tramite la AWS Command Line Interface (AWS CLI)

AWS CLI è uno strumento open source che consente di interagire con i servizi AWS tramite i comandi nella shell a riga di comando. Per completare le fasi riportate in questa sezione, è necessario disporre della AWS CLI versione 2.

È possibile utilizzare AWS CLI per recuperare i log per una chiamata utilizzando l'opzione di comando --log-type. La risposta include un campo LogResult che contiene fino a 4 KB di log con codifica base64 del richiamo.

Esempio recuperare un ID di log

Nell'esempio seguente viene illustrato come recuperare un ID di log dal LogResult campo per una funzione denominata my-function.

aws lambda invoke --function-name my-function out --log-type Tail

Verrà visualizzato l'output seguente:

{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
Esempio decodificare i log

Nello stesso prompt dei comandi, utilizzare l'base64 utilità per decodificare i log. Nell'esempio seguente viene illustrato come recuperare i log codificati in base64 per my-function.

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

L'opzione cli-binary-format è necessaria se si utilizza la versione 2 della AWS CLI. Per rendere questa impostazione come predefinita, esegui aws configure set cli-binary-format raw-in-base64-out. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.

Verrà visualizzato l'output seguente:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB

L'utilità base64 è disponibile su Linux, macOS e Ubuntu su Windows. Gli utenti macOS potrebbero dover utilizzare base64 -D.

Esempio Script get-logs.sh

Nello stesso prompt dei comandi, utilizzare lo script seguente per scaricare gli ultimi cinque eventi di log. Lo script utilizza sed per rimuovere le virgolette dal file di output e rimane in sospensione per 15 secondi in attesa che i log diventino disponibili. L'output include la risposta di Lambda e l'output del comando get-log-events.

Copiare il contenuto del seguente esempio di codice e salvare nella directory del progetto Lambda come get-logs.sh.

L'opzione cli-binary-format è necessaria se si utilizza la versione 2 della AWS CLI. Per rendere questa impostazione come predefinita, esegui aws configure set cli-binary-format raw-in-base64-out. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
Esempio (solo) macOS e Linux

Nello stesso prompt dei comandi, gli utenti macOS e Linux potrebbero dover eseguire il seguente comando per assicurarsi che lo script sia eseguibile.

chmod -R 755 get-logs.sh
Esempio recuperare gli ultimi cinque eventi di log

Nello stesso prompt dei comandi, eseguire lo script seguente per ottenere gli ultimi cinque eventi di log.

./get-logs.sh

Verrà visualizzato l'output seguente:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

Eliminazione dei log

I gruppi di log non vengono eliminati automaticamente quando si elimina una funzione. Per evitare di archiviare i log a tempo indeterminato, eliminare il gruppo di log o configurare un periodo di conservazione trascorso il quale i log vengono eliminati automaticamente.