AWS Lambda
Guia do desenvolvedor

Registro em log da função do AWS Lambda no Java

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 código de função, você pode usar métodos no java.lang.System ou qualquer módulo de registro em log que grave no stdout ou no stderr. O exemplo a seguir usa System.out.println.

exemplo Hello.java

package example; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; public class Hello { public String myHandler(String name, Context context) { System.out.println("Event received."); return String.format("Hello %s.", name); } }

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 amostra de processador de erros para o AWS Lambda.

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: 8e827ab1-f155-11e8-b06d-018ab046158d Version: $LATEST Processing event... END RequestId: 8e827ab1-f155-11e8-b06d-018ab046158d REPORT RequestId: 8e827ab1-f155-11e8-b06d-018ab046158d Duration: 29.40 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB

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

Os grupos de log 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.

LambdaLogger

O Lambda fornece um objeto do registrador que você pode recuperar do objeto de contexto. O LambdaLogger oferece suporte a logs com várias linhas. Se você registrar uma string que inclui quebras de linha com o System.out.println, cada quebra de linha resultará em uma entrada separada no CloudWatch Logs. Se você usar o LambdaLogger, obterá uma entrada com várias linhas.

O exemplo de função a seguir registra informações de contexto.

exemplo ContextLogger.java

package example; import java.io.InputStream; import java.io.OutputStream; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.LambdaLogger; public class ContextLogger { public static void myHandler(InputStream inputStream, OutputStream outputStream, Context context) { LambdaLogger logger = context.getLogger(); int letter; try { while((letter = inputStream.read()) != -1) { outputStream.write(Character.toUpperCase(letter)); } Thread.sleep(3000); // Intentional delay for testing the getRemainingTimeInMillis() result. } catch (Exception e) { e.printStackTrace(); } logger.log("Log data from LambdaLogger \n with multiple lines"); // Print info from the context object logger.log("Function name: " + context.getFunctionName()); logger.log("Max mem allocated: " + context.getMemoryLimitInMB()); logger.log("Time remaining in milliseconds: " + context.getRemainingTimeInMillis()); // Return the log stream name so you can look up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); } }

Dependências

  • aws-lambda-java-core

Crie o código com as dependências da biblioteca do Lambda para criar um pacote de implantação. Para obter instruções, consulte Pacote de implantação do AWS Lambda no Java.

Appender personalizado do Log4j 2

O AWS Lambda recomenda o Log4j 2 como provedor de um appender personalizado. Você pode usar o appender personalizado do Apache log4j fornecido pelo Lambda para fazer registros em log de suas funções. O appender personalizado chama-se LambdaAppender e deve ser usado no arquivo log4j2.xml. Você deve incluir o artefato aws-lambda-java-log4j2 (artifactId:aws-lambda-java-log4j2) no pacote de implantação (arquivo .jar).

exemplo Hello.java

package example; import com.amazonaws.services.lambda.runtime.Context; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Hello { // Initialize the Log4j logger. static final Logger logger = LogManager.getLogger(Hello.class); public String myHandler(String name, Context context) { logger.error("log data from log4j err."); // Return will include the log stream name so you can look // up the log later. return String.format("Hello %s. log stream = %s", name, context.getLogStreamName()); } }

O exemplo anterior usa o seguinte arquivo log4j2.xml para carregar propriedades

exemplo log4j2.xml

<?xml version="1.0" encoding="UTF-8"?> <Configuration packages="com.amazonaws.services.lambda.runtime.log4j2"> <Appenders> <Lambda name="Lambda"> <PatternLayout> <pattern>%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1}:%L - %m%n</pattern> </PatternLayout> </Lambda> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Lambda" /> </Root> </Loggers> </Configuration>

Dependências

  • aws-lambda-java-log4j2

  • log4j-core

  • log4j-api

Crie o código com as dependências da biblioteca do Lambda para criar um pacote de implantação. Para obter instruções, consulte Pacote de implantação do AWS Lambda no Java.