Registro em log da função do AWS Lambda em Python - AWS Lambda

Registro em log da função do AWS Lambda em Python

Sua função do Lambda vem com um grupo de logs do CloudWatch Logs, com um fluxo de logs para cada instância de sua função. O tempo de execução envia detalhes sobre cada invocação para o fluxo de logs e retransmite os logs e outras saídas do código da função.

Para gerar os logs do seu código da função, você pode usar o método print 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 lambda_function.py

import os def lambda_handler(event, context): print('## ENVIRONMENT VARIABLES') print(os.environ) print('## EVENT') print(event)

exemplo formato do log

START RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Version: $LATEST ## ENVIRONMENT VARIABLES environ({'AWS_LAMBDA_LOG_GROUP_NAME': '/aws/lambda/my-function', 'AWS_LAMBDA_LOG_STREAM_NAME': '2020/01/31/[$LATEST]3893xmpl7fac4485b47bb75b671a283c', 'AWS_LAMBDA_FUNCTION_NAME': 'my-function', ...}) ## EVENT {'key': 'value'} END RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 REPORT RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Duration: 15.74 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 130.49 ms XRAY TraceId: 1-5e34a614-10bdxmplf1fb44f07bc535a1 SegmentId: 07f5xmpl2d1f6f85 Sampled: true

O tempo de execução do Python registra as linhas START, END e REPORT para cada invocação. A linha do relatório fornece os seguintes detalhes.

Registro em log de relatório

  • RequestId – o ID de solicitação exclusivo 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 tempo de execução levou para carregar a função e executar o código fora do método do manipulador.

  • XRAY TraceId – para solicitações rastreadas, o ID de rastreamento do AWS X-Ray.

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

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

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

Visualizar logs no Console de gerenciamento da AWS

O console do Lambda mostra a saída de log quando você testa uma função na página de configuração da função. Para visualizar log para todas as invocações, use o console do CloudWatch Logs.

Para visualizar os logs da função doLambda

  1. Abra a página Logs do console do CloudWatch.

  2. Escolha o nome do grupo de logs para a sua função (/aws/lambda/function-name).

  3. Escolha o primeiro fluxo da lista.

Cada fluxo de log corresponde a uma instância da sua função. Novos fluxos aparecem quando você atualiza a função e quando instâncias adicionais são criadas para processar várias invocações simultâneas. Para encontrar logs para invocações específicas, você pode instrumentar a função com o X-Ray e registrar detalhes sobre a solicitação e o fluxo de log no rastreamento. Para obter um exemplo de aplicativo que correlaciona logs e rastreamentos com o X-Ray, consulte Aplicativo de exemplo de processador de erros para o AWS Lambda.

Usar a AWS CLI

Para obter logs para uma invocação a partir da linha de comando, use a opção --log-type. A resposta inclui um campo LogResult que contém até 4 KB de logs codificados em base64 da invocação.

$ aws lambda invoke --function-name my-function out --log-type Tail { "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }

Você pode usar o utilitário base64 para decodificar os logs.

$ aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d 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: 100 ms Memory Size: 128 MB Max Memory Used: 73 MB

O utilitário base64 está disponível no Linux, macOS e Ubuntu no Windows. Para macOS, o comando é base64 -D.

Para obter eventos de log completos a partir da linha de comando, você pode incluir o nome do fluxo de logs na saída de sua função, conforme mostrado no exemplo anterior. O script de exemplo a seguir invoca uma função chamada my-function e faz o download dos últimos 5 eventos de log.

exemplo Script get-logs.sh

Este exemplo requer que my-function retorne um ID de fluxo de log.

#!/bin/bash aws lambda invoke --function-name my-function --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 $(cat out) --limit 5

O script usa sed para remover aspas do arquivo de saída e dorme por 15 segundos para permitir que os logs estejam disponíveis. A saída inclui a resposta do Lambda, e a saída do comando get-log-events.

$ ./get-logs.sh { "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: 100 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 quando você exclui uma função. Para evitar armazenar logs de maneira indefinida, exclua o grupo de logs ou configure um período de retenção após o qual os logs serão excluídos automaticamente.

Biblioteca de registros em log

Para logs mais detalhados, use a biblioteca de logs.

import os import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): logger.info('## ENVIRONMENT VARIABLES') logger.info(os.environ) logger.info('## EVENT') logger.info(event)

A saída de logger inclui o nível do log, o timestamp e o ID da solicitação.

START RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Version: $LATEST [INFO] 2020-01-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 ## ENVIRONMENT VARIABLES [INFO] 2020-01-31T22:12:58.534Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 environ({'AWS_LAMBDA_LOG_GROUP_NAME': '/aws/lambda/my-function', 'AWS_LAMBDA_LOG_STREAM_NAME': '2020/01/31/[$LATEST]1bbe51xmplb34a2788dbaa7433b0aa4d', 'AWS_LAMBDA_FUNCTION_NAME': 'my-function', ...}) [INFO] 2020-01-31T22:12:58.535Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 ## EVENT [INFO] 2020-01-31T22:12:58.535Z 1c8df7d3-xmpl-46da-9778-518e6eca8125 {'key': 'value'} END RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 REPORT RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Duration: 2.75 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 56 MB Init Duration: 113.51 ms XRAY TraceId: 1-5e34a66a-474xmpl7c2534a87870b4370 SegmentId: 073cxmpl3e442861 Sampled: true