AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

对 Log4j™ 1.2 使用以前的自定义 Appender (不推荐)

注意

我们已结束对 Log4j v1.2 自定义 Appender 的支持。它不会再有例行更新,我们也不建议再使用它。有关更多信息,请参阅 Log4j 1.2

AWS Lambda 通过提供自定义 Appender 来支持 Log4j 1.2。您可使用由 Lambda 提供的自定义 Log4j (请参阅 Apache log4j 1.2) Appender 从您的 Lambda 函数记录日志。每个对 Log4j 方法的调用(如 log.debug()log.error())都将生成一个 CloudWatch Logs 事件。自定义 Appender 称为 LambdaAppender 并且必须在 log4j.properties 文件中使用。您必须在部署程序包(.jar 文件)中包含 aws-lambda-java-log4j 工件 (artifactId:aws-lambda-java-log4j)。有关示例,请参阅示例:使用 Log4J v1.2 编写日志 (不推荐)

示例:使用 Log4J v1.2 编写日志 (不推荐)

注意

Log4j V1.x 已标记为终止使用。有关更多信息,请参阅 Log4j 1.2

以下 Java 代码示例使用 System 方法和 Log4j 编写日志,说明它们在 AWS Lambda 将日志信息记录到 CloudWatch 时的差异。

Copy
package example; import com.amazonaws.services.lambda.runtime.Context; import org.apache.logging.log4j.Logger; public class Hello { // Initialize the Log4j logger. static final Logger log = Logger.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"); // Use log4j to log the same thing as above and AWS Lambda will log only one event in CloudWatch. log.debug("log data from log4j debug \n this is continuation of log4j debug"); log.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()); } }

该示例使用 log4j.properties 文件 (project-dir/src/main/resources/ directory)。

Copy
log = . log4j.rootLogger = DEBUG, LAMBDA #Define the LAMBDA appender log4j.appender.LAMBDA=com.amazonaws.services.lambda.runtime.log4j.LambdaAppender log4j.appender.LAMBDA.layout=org.apache.log4j.PatternLayout log4j.appender.LAMBDA.layout.conversionPattern=%d{yyyy-MM-dd HH:mm:ss} <%X{AWSRequestId}> %-5p %c{1}:%m%n

下面是 CloudWatch Logs 中的日志条目示例。

注意:

  • 由于存在换行符,AWS Lambda 将每个 System.out.println()System.err.println() 语句日志记录中的日志字符串分析为两个独立事件(请注意屏幕截图中的两个向下箭头)。

  • Log4j 方法(log.debug()log.error())生成一个 CloudWatch 事件。

  • AWS Lambda 运行时将 MDC 中的 AWSRequestId 添加到 log4j 上下文 (请参阅 log4j v 1.2 的 Class MDC 和 Class ThreadContext)。为在所示日志中获取此值,我们在 %X{AWSRequestId} 文件中以转换模式添加了 log4.properties

您可以执行以下操作来测试代码:

  • 使用这些代码创建部署程序包。在您的项目中,不要忘记将 log4j.properties 文件添加到 project-dir/src/main/resources/ 目录中。

  • 将部署程序包上传到 AWS Lambda 以创建 Lambda 函数。

  • 使用字符串 ("this is a test") 作为示例事件来测试您的 Lambda 函数。处理程序代码接收示例事件但不对其执行任何操作。它只演示如何写入日志。

按照“入门”中提供的说明进行操作。有关更多信息,请参阅 步骤 2.3:(可选)创建用 Java 编写的 Lambda 函数。注意以下不同:

  • 创建部署程序包时,不要忘了 Log4j 1.2 的 aws-lambda-java-log4j 依赖项。

  • 在创建 Lambda 函数时,指定 example.Hello::myHandler (package.class::method) 作为处理程序值。