AWS Lambda
Guia do desenvolvedor

Registro da função do AWS Lambda no Java

Sua função do Lambda pode conter instruções de registro e o AWS Lambda, por sua vez, grava esses logs no CloudWatch. Recomendamos que você faça o seguinte para gravar logs.

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 Log4j (consulte Apache log4j) fornecido pelo Lambda para fazer registros em log de suas funções lambda. Todas as chamadas para os métodos do Log4j, como log.info() ou log.error(), terão como resultado um evento do CloudWatch Logs. 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). Para ver um exemplo, consulte Exemplo 1: Gravação de logs usando o Log4J v2.8 .

LambdaLogger.log()

Todas as chamadas para LambdaLogger.log() resultam em um evento do CloudWatch Logs, contanto que o tamanho do evento esteja dentro dos limites permitidos. Para obter informações sobre os limites do CloudWatch Logs, consulte Limites do CloudWatch Logs no Guia do usuário do Amazon CloudWatch. Para ver um exemplo, consulte Exemplo 2: Gravação de logs usando o LambdaLogger (Java).

Além disso, você também pode usar as seguintes instruções no código da função do Lambda para gerar as entradas de log:

  • System.out()

  • System.err()

No entanto, observe que o AWS Lambda trata cada linha retornada por System.out e System.err como um evento separado. Isso funciona bem quando cada linha de saída corresponde a uma única entrada de log. Quando uma entrada de log tem várias linhas de saída, o AWS Lambda tenta analisá-las usando as quebras de linha para identificar eventos separados. Por exemplo, as instruções a seguir registram as duas palavras ("Hello" e "world") no log como dois eventos separados:

System.out.println("Hello \n world");

Como localizar logs

Você pode encontrar os logs gravados por sua função do Lambda da seguinte forma:

  • Localizar logs no CloudWatch Logs. O objeto context (na biblioteca aws-lambda-java-core) fornece os métodos getLogStreamName() e getLogGroupName(). Usando esses métodos, é possível encontrar o fluxo de logs específico onde os logs são gravados.

  • Se você invocar uma função do Lambda pelo console, o tipo de invocação será sempre RequestResponse (ou seja, uma execução síncrona) e o console exibirá os logs gravados pela função do Lambda usando o objeto LambdaLogger. O AWS Lambda também retorna logs dos métodos System.out e System.err.

  • Se você invocar uma função do Lambda em um programa, poderá adicionar o parâmetro LogType para recuperar os últimos 4 KB de dados de log que foram gravados no CloudWatch Logs. Para obter mais informações, consulte Invoke. O AWS Lambda retorna as informações desse log no cabeçalho x-amz-log-results dentro da resposta. Se você usar a AWS Command Line Interface para invocar a função, poderá especificar o parâmetro --log-type com o valor Tail.

Exemplos de registro em log (Java)

Esta seção fornece exemplos de como usar o appender personalizado do Log4j e os objetos LambdaLogger para registrar informações em log.

Exemplo 1: Gravação de logs usando o Log4J v2.8

  • Veja a seguir como criar seu artefato com o Maven para incluir corretamente os plugins Log4j v2.8:

    • Para Maven pom.xml:

      <dependencies> ... <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.8.2</version> </dependency> .... </dependencies>
    • Se estiver usando o Maven Shade Plugin, defina a configuração do plugin da seguinte maneira:

      <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer"> </transformer> </transformers> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.github.edwgiz</groupId> <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId> <version>2.8.1</version> </dependency> </dependencies> </plugin> ... </plugins>
    • O código de exemplo Java a seguir mostra como usar o Log4j com o Lambda:

      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) { // System.out: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out"); // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr. \n this is a continuation of system.err"); logger.error("log data from log4j err. \n this is a continuation of 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

      <?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>

Exemplo 2: Gravação de logs usando o LambdaLogger (Java)

O seguinte exemplo de código Java grava logs usando tanto os métodos do sistema quanto o objeto LambdaLogger para ilustrar como eles diferem quando o AWS Lambda registra informações no CloudWatch.

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: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.out.println("log data from stdout \n this is continuation of system.out"); // System.err: One log statement but with a line break (AWS Lambda writes two events to CloudWatch). System.err.println("log data from stderr \n this is continuation of system.err"); LambdaLogger logger = context.getLogger(); // Write log to CloudWatch using LambdaLogger. logger.log("log data from LambdaLogger \n this is continuation of logger.log"); // 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()); } }

A seguir está uma amostra das entradas de log no CloudWatch Logs.

Observações:

  • O AWS Lambda analisa a string de log em cada um dos logs de instruções System.out.println() e System.err.println() como dois eventos separados (observe as duas setas para baixo na captura de tela) devido à quebra de linha.

  • O LambdaLogger.log() produz um evento do CloudWatch.

Você pode fazer o seguinte para testar o código:

  • Usando o código, crie um pacote de implantação.

  • Faça upload do pacote de implantação para o AWS Lambda criar sua função do Lambda.

  • Para testar sua função Lambda, use uma string ("este é um teste") como evento de amostra. O código do manipulador recebe o evento de amostra, mas não faz nada com ele. Ele só mostra como gravar logs.

Siga as instruções fornecidas nos conceitos básicos. Para obter mais informações, consulte Criar uma função do Lambda escrita em Java. Observe as seguintes diferenças:

  • Quando você criar um pacote de implantação, não se esqueça da dependência da biblioteca aws-lambda-java-core.

  • Ao criar a função do Lambda, especifique example.Hello::myHandler (package.class::method) como o valor do manipulador.