AWS Lambda
开发人员指南

Java 中的 AWS Lambda 函数日志记录

您的 Lambda 函数带有一个 CloudWatch Logs 日志组,其中包含您的函数的每个实例的日志流。运行时会将每个调用的详细信息发送到该日志流,然后中继日志和来自您的函数代码的其他输出。

要从函数代码输出日志,您可以使用 java.lang.System 的方法或使用写入到 stdoutstderr 的任何日志记录模块。下面的示例使用了 System.out.println

例 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); } }

当您在函数配置页上测试函数时,Lambda 控制台会显示日志输出。要查看所有调用的日志,请使用 CloudWatch Logs 控制台。

查看 Lambda 函数的日志

  1. 打开 CloudWatch 控制台的日志页面

  2. 选择您的函数 (/aws/lambda/function-name) 的日志组。

  3. 选择列表中的第一个流。

每个日志流对应一个函数实例。当您更新函数以及创建更多实例以处理多个并发调用时,会显示新的流。要找到特定调用的日志,您可以使用 X-Ray 分析您的函数并在跟踪中记录有关请求和日志流的详细信息。如需将日志和跟踪与 X-Ray 相关联的示例应用程序,请参阅AWS Lambda 错误处理器示例应用程序

要从命令行获取调用的日志,请使用 --log-type 选项。响应包含一个 LogResult 字段,该字段包含来自调用的多达 4 KB 的 base64 编码日志。

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

您可以使用 base64 实用程序来解码日志。

$ 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

base64 实用工具在 Linux、macOS 和 Ubuntu on Windows 上可用。对于 macOS,命令为 base64 -D

在删除函数时,不会自动删除日志组。为避免存储无限的日志,请删除日志组或者配置保留期,在该期限后会自动删除日志。

LambdaLogger

Lambda 提供可从上下文对象进行检索的记录器对象。LambdaLogger 支持多行日志。如果您使用 System.out.println 记录包含换行的字符串,每个换行在 CloudWatch Logs 中会导致单独的条目。如果您使用 LambdaLogger,则会获得一个多行的条目。

以下示例函数记录上下文信息。

例 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()); } }

附属物

  • aws-lambda-java-core

使用 Lambda 库依赖项构建代码以创建部署程序包。有关说明,请参阅Java 中的 AWS Lambda 部署程序包

适用于 Log4j 的自定义 Appender

AWS Lambda 推荐使用 Log4j 2 来提供自定义 Appender。您可以使用 Lambda 提供的自定义 Apache log4j Appender 从您的函数记录日志。自定义 Appender 称为 LambdaAppender 并且必须在 log4j2.xml 文件中使用。您必须在部署程序包中包含 aws-lambda-java-log4j2 工件 (artifactId:aws-lambda-java-log4j2)。

例 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()); } }

前面的示例使用以下 log4j2.xml 文件来加载属性

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

附属物

  • aws-lambda-java-log4j2

  • log4j-core

  • log4j-api

使用 Lambda 库依赖项构建代码以创建部署程序包。有关说明,请参阅Java 中的 AWS Lambda 部署程序包