Registro em log da função do AWS Lambda em Node.js - AWS Lambda

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Registro em log da função do AWS Lambda em Node.js

AWS Lambdamonitora automaticamente as funções do Lambda em seu nome e envia registros para a Amazon. CloudWatch Sua função Lambda vem com um grupo de CloudWatch registros de registros e um fluxo de registros para cada instância de sua função. O ambiente do runtime do Lambda envia detalhes sobre cada invocação à transmissão de logs e transmite os logs e outras saídas do código de sua função. Para ter mais informações, consulte Usando CloudWatch registros da Amazon com AWS Lambda.

Esta página descreve como produzir uma saída de log a partir do código da sua função Lambda ou acessar registros usando o AWS Command Line Interface console Lambda ou o console. CloudWatch

Criar uma função que retorna logs

Para gerar os logs do código de função, você pode usar métodos no objeto do console ou qualquer biblioteca de logs que grave no stdout ou stderr. O exemplo a seguir registra em log os valores das variáveis de ambiente e o objeto do evento.

exemplo Arquivo index.js: registro em 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 }
exemplo formato do 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: 200 ms Memory Size: 128 MB Max Memory Used: 74 MB Init Duration: 166.62 ms XRAY TraceId: 1-5d9d007f-0a8c7fd02xmpl480aed55ef0 SegmentId: 3d752xmpl1bbe37e Sampled: true

O runtime do Node.js registra as linhas START, END e REPORT para cada invocação. Ele adiciona um carimbo de data e hora, o ID da solicitação e o nível de log em cada entrada registrada pela função. A linha do relatório fornece os detalhes a seguir.

RELATAR campos de dados de linha
  • RequestId— O ID exclusivo da solicitação para a invocação.

  • Duração: a quantidade de tempo que o método de manipulador da função gastou processando o evento.

  • Duração faturada: a quantia de tempo faturada para a invocação.

  • Tamanho da memória: a quantidade de memória alocada para a função.

  • Memória máxima utilizada: a quantidade de memória utilizada pela função.

  • Duração inicial: para a primeira solicitação atendida, a quantidade de tempo que o runtime levou para carregar a função e executar o código fora do método do handler.

  • XRAY TraceId — Para solicitações rastreadas, o ID de AWS X-Rayrastreamento.

  • SegmentId— Para solicitações rastreadas, o ID do segmento X-Ray.

  • Amostragem: para solicitações rastreadas, o resultado da amostragem.

Você pode visualizar os registros no console Lambda, no console CloudWatch Logs ou na linha de comando.

Usar controles avançados de registro em log do Lambda com Node.js

Para dar mais controle sobre como os logs das funções são capturados, processados e consumidos, você pode configurar as seguintes opções de log para runtimes compatíveis do Node.js:

  • Formato do log: selecione entre texto simples e formato JSON estruturado para os logs da sua função.

  • Nível de registro - para registros no formato JSON, escolha o nível de detalhes dos registros que o Lambda envia para a CloudWatch Amazon, como ERROR, DEBUG ou INFO

  • Grupo de registros - escolha o grupo de CloudWatch registros para o qual sua função envia registros

Para obter mais informações sobre essas opções de registro em log e instruções sobre como configurar a função para usá-las, consulte Configurar controles avançados de registro em log para a função do Lambda.

Para usar as opções de formato de log e nível de log com as funções do Lambda para Node.js, consulte as orientações nas seções a seguir.

Usar logs JSON estruturados com Node.js

Se você selecionar JSON para o formato de log da sua função, o Lambda enviará a saída de registros usando os métodos console.trace de console deconsole.debug,,,, console.log console.infoconsole.error, console.warn e CloudWatch para como JSON estruturado. Cada objeto de log JSON contém pelo menos quatro pares de valores-chave com as seguintes chaves:

  • "timestamp": o horário em que a mensagem de log foi gerada.

  • "level": o nível de log atribuído à mensagem.

  • "message": o conteúdo da mensagem de log.

  • "requestId": o ID de solicitação exclusivo para invocar a função.

Dependendo do método de registro em log que a função usa, esse objeto JSON também pode conter pares de chaves adicionais. Por exemplo, se a função usa métodos do console para registrar em log objetos de erro usando vários argumentos, o objeto JSON conterá pares adicionais de valores de chave com as chaves errorMessage, errorType e stackTrace.

Se o código já usa outra biblioteca de logs, como o Powertools para AWS Lambda, para produzir logs em JSON estruturados, você não precisa fazer nenhuma alteração. O Lambda não codifica duas vezes nenhum log que já esteja codificado em JSON. Então, os logs de aplicações da função continuarão sendo capturados como antes.

Para obter mais informações sobre como usar o pacote Powertools for AWS Lambda para criar logs em JSON estruturados no runtime do Node.js, consulte AWS Lambdalogin da função TypeScript.

Exemplos de saídas de log formatadas em JSON

Os exemplos a seguir mostram como várias saídas de log geradas usando os console métodos com argumentos únicos e múltiplos são capturadas em CloudWatch Logs quando você define o formato de log da sua função como JSON.

O primeiro exemplo usa o método do console.error para gerar uma string simples.

exemplo Código de registro em log do Node.js
export const handler = async (event) => { console.error("This is a warning message"); ... }
exemplo Registro em log JSON
{ "timestamp":"2023-11-01T00:21:51.358Z", "level":"ERROR", "message":"This is a warning message", "requestId":"93f25699-2cbf-4976-8f94-336a0aa98c6f" }

Você também pode gerar mensagens de log estruturadas mais complexas usando argumentos únicos ou múltiplos com os métodos do console. No próximo exemplo, você usará console.log para gerar dois pares de valores de chave usando um único argumento. Observe que o "message" campo no objeto JSON que o Lambda envia CloudWatch para Logs não é stringificado.

exemplo Código de registro em log do Node.js
export const handler = async (event) => { console.log({data: 12.3, flag: false}); ... }
exemplo Registro em log JSON
{ "timestamp": "2023-12-08T23:21:04.664Z", "level": "INFO", "requestId": "405a4537-9226-4216-ac59-64381ec8654a", "message": { "data": 12.3, "flag": false } }

No próximo exemplo, você usará novamente o método do console.log para criar uma saída de log. Dessa vez, o método usa dois argumentos, um mapa contendo dois pares de valores de chave e uma string identificadora. Observe que, nesse caso, como você forneceu dois argumentos, o Lambda converte o campo "message" em strings.

exemplo Código de registro em log do Node.js
export const handler = async (event) => { console.log('Some object - ', {data: 12.3, flag: false}); ... }
exemplo Registro em log JSON
{ "timestamp": "2023-12-08T23:21:04.664Z", "level": "INFO", "requestId": "405a4537-9226-4216-ac59-64381ec8654a", "message": "Some object - { data: 12.3, flag: false }" }

O Lambda atribui saídas geradas usando console.log no nível de log INFO.

O exemplo final mostra como objetos de erro podem ser enviados para CloudWatch Logs usando os console métodos. Observe que, quando são registrados objetos de erro usando vários argumentos, o Lambda adiciona os campos errorMessage, errorType e stackTrace à saída do log. Para saber mais sobre erros de função em Node.js, consulte Erros da função do AWS Lambda em Node.js.

exemplo Código de registro em log do 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); };
exemplo Registro em log JSON
{ "timestamp": "2023-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": "2023-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)" ] }

Ao registrar em log vários tipos de erro, os campos adicionais errorMessage, errorType e stackTrace são extraídos do primeiro tipo de erro fornecido ao método do console.

Usar bibliotecas cliente com logs de formato de métricas incorporadas (EMF) em JSON estruturado

A AWS fornece bibliotecas cliente de código aberto para o Node.js que podem ser usadas para criar logs de formato de métricas incorporadas (EMF). Se você já tem funções que usam essas bibliotecas e altera o formato de log da função para JSON, CloudWatch talvez não reconheça mais as métricas emitidas pelo seu código.

Se seu código atualmente emite registros EMF diretamente usando console.log ou usando Powertools for AWS Lambda (TypeScript), também não CloudWatch será possível analisá-los se você alterar o formato de log da sua função para JSON.

Importante

Para garantir que os registros EMF de suas funções continuem sendo analisados adequadamente CloudWatch, atualize seu EMF e Powertools for AWS Lambda bibliotecas para as versões mais recentes. Ao mudar para logs em formato JSON, também recomendamos que você realize testes a fim de garantir a compatibilidade com as métricas incorporadas da função. Se o seu código emitir logs em EMF diretamente usando console.log, altere o código para gerar essas métricas diretamente em stdout, conforme mostrado no código de exemplo a seguir.

exemplo código que emite métricas incorporadas para 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")

Usar a filtragem em nível de log com Node.js

Para o AWS Lambda filtrar os logs de aplicação de acordo com o nível de log, a função precisa usar logs em formato JSON. Isso pode ser feito de duas maneiras:

  • Crie saídas de log usando os métodos padrão do console e configure a função para usar logs em formato JSON. Dessa forma, o AWS Lambda filtra suas saídas de logs usando o par de valores-chave “nível” no objeto JSON descrito em Usar logs JSON estruturados com Node.js. Para saber como configurar o formato de log da função, consulte Configurar controles avançados de registro em log para a função do Lambda.

  • Use outro método ou biblioteca de logs para criar logs JSON estruturados no código, de modo que incluam um par de valores-chave de “nível” para definir o nível da saída de log. Por exemplo, você pode usar o Powertools para AWS Lambda para gerar saídas de log JSON estruturado do seu código. Consulte AWS Lambdalogin da função TypeScript para saber mais sobre como usar o Powertools com o runtime do Node.js.

    Para que o Lambda filtre os logs da função, você também precisa incluir um par de valores-chave "timestamp" na saída do log JSON. A hora deve ser especificada em um formato RFC 3339 válido de carimbo de data/hora. Se você não fornecer um carimbo de data/hora válido, o Lambda atribuirá ao log o nível INFO e adicionará um carimbo de data/hora.

Ao configurar sua função para usar a filtragem em nível de registro, você seleciona o nível de registros que deseja enviar AWS Lambda para o CloudWatch Logs a partir das seguintes opções:

Nível de log Uso padrão
TRACE (mais detalhes) As informações mais detalhadas usadas para rastrear o caminho da execução do código
DEBUG Informações detalhadas para depuração do sistema
INFO Mensagens que registram a operação normal da função
WARN Mensagens sobre possíveis erros que podem levar a um comportamento inesperado se não forem corrigidos
ERRO Mensagens sobre problemas que impedem que o código funcione conforme o esperado
FATAL (menos detalhes) Mensagens sobre erros graves que fazem a aplicação parar de funcionar

O Lambda envia registros do nível selecionado e inferiores a. CloudWatch Por exemplo, se você configurar um nível de log de WARN, o Lambda enviará logs correspondentes aos níveis WARN, ERROR e FATAL.

Usar o console do Lambda

Você pode usar o console do Lambda para exibir a saída do log depois de invocar uma função do Lambda.

Se seu código puder ser testado no editor de Código incorporado, você encontrará logs nos resultados de execução. Ao usar o recurso de teste do console para invocar uma função, você encontrará Saída de log na seção Detalhes.

Usando o CloudWatch console

Você pode usar o CloudWatch console da Amazon para visualizar os registros de todas as invocações da função Lambda.

Para ver os registros no CloudWatch console
  1. Abra a página Grupos de registros no CloudWatch console.

  2. Escolha o grupo de registros para sua função (/aws/lambda/ your-function-name).

  3. Escolha um stream de logs.

Cada fluxo de log corresponde a uma instância da sua função. Uma transmissão de logs é exibida quando você atualiza sua função do Lambda e quando mais instâncias são criadas para lidar com várias invocações simultâneas. Para localizar logs de uma invocação específica, recomendamos intrumentar sua função com AWS X-Ray. O X-Ray registra detalhes sobre a solicitação e o stream de logs no rastreamento.

Para usar uma aplicação de exemplo que correlaciona os logs e os rastreamentos com o X-Ray, consulte Aplicativo de exemplo de processador de erros para o AWS Lambda.

Usar a AWS Command Line Interface (AWS CLI)

O AWS CLI é uma ferramenta de código aberto que permite interagir com os serviços do AWS usando comandos no shell da linha de comando. Para executar as etapas desta seção, você deve ter o seguinte:

Você pode usar a AWS CLI para recuperar logs de uma invocação usando a opção de comando --log-type. A resposta contém um campo LogResult com até 4 KB de logs codificados em base64 obtidos da invocação.

exemplo recuperar um ID de log

O exemplo a seguir mostra como recuperar um ID de log do campo LogResult para uma função chamada my-function.

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

A seguinte saída deverá ser mostrada:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
exemplo decodificar os logs

No mesmo prompt de comando, use o utilitário base64 para decodificar os logs. O exemplo a seguir mostra como recuperar logs codificados em base64 de 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

A opção cli-binary-format será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute aws configure set cli-binary-format raw-in-base64-out. Para obter mais informações, consulte A AWS CLI comporta opções de linha de comando globais no Guia do usuário da AWS Command Line Interface versão 2.

A seguinte saída deverá ser mostrada:

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

O utilitário base64 está disponível no Linux, macOS e Ubuntu no Windows. Os usuários do macOS precisam usar base64 -D.

exemplo get-logs.sh script

No mesmo prompt de comando, use o script a seguir para fazer download dos últimos cinco eventos de log. O script usa sed para remover as aspas do arquivo de saída e fica inativo por 15 segundos para que os logs tenham tempo de ficar disponíveis. A saída inclui a resposta do Lambda, e a saída do comando get-log-events.

Copie o conteúdo do exemplo de código a seguir e salve no diretório de seu projeto do Lambda como get-logs.sh.

A opção cli-binary-format será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute aws configure set cli-binary-format raw-in-base64-out. Para obter mais informações, consulte A AWS CLI comporta opções de linha de comando globais no Guia do usuário da AWS Command Line Interface versão 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
exemplo macOS e Linux (somente)

No mesmo prompt de comando, os usuários do macOS e do Linux podem precisar executar o comando a seguir para garantir que o script seja executável.

chmod -R 755 get-logs.sh
exemplo recuperar os últimos cinco eventos de log

No mesmo prompt de comando, execute o script a seguir para obter os últimos cinco eventos de log.

./get-logs.sh

A seguinte saída deverá ser mostrada:

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

Excluir logs

Os grupos de logs não são excluídos automaticamente excluídos quando você exclui uma função. Para evitar armazenar logs indefinidamente, exclua o grupo de logs ouConfigurar um período de retençãoapós o qual os logs são excluídos automaticamente.