AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Java 中的 AWS Lambda 函数日志记录

AWS Lambda 将代表您自动监控 Lambda 函数并将函数指标发送至 Amazon CloudWatch。您的 Lambda 函数带有一个 CloudWatch

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

本页介绍如何从 Lambda 函数的代码生成日志输出,或使用 AWS Command Line Interface、Lambda 控制台或 CloudWatch 控制台访问日志。

创建返回日志的函数

要从函数代码输出日志,您可以使用 java.lang.System 的方法,或使用写入到 stdout 或 stderr 的任何日志记录模块。aws-lambda-java-core 库提供一个名为 LambdaLogger 的记录器类,您可以从上下文对象访问该类。记录器类支持多行日志。

以下示例使用上下文对象提供的 LambdaLogger 记录器。

例 Handler.java

// Handler value: example.Handler

public class Handler implements RequestHandler{

Gson gson = new GsonBuilder().setPrettyPrinting().create();

@Override

public String handleRequest(Object event, Context context)

{

LambdaLogger logger = context.getLogger();

String response = new String("SUCCESS");

// log execution details

logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));

logger.log("CONTEXT: " + gson.toJson(context));

// process event

logger.log("EVENT: " + gson.toJson(event));

return response;

}

}

例 日志格式

START RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 Version: $LATEST

ENVIRONMENT VARIABLES:

{

"_HANDLER": "example.Handler",

"AWS_EXECUTION_ENV": "AWS_Lambda_java8",

"AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",

...

}

CONTEXT:

{

"memoryLimit": 512,

"awsRequestId": "6bc28136-xmpl-4365-b021-0ce6b2e64ab0",

"functionName": "java-console",

...

}

EVENT:

{

"records": [

{

"messageId": "19dd0b57-xmpl-4ac1-bd88-01bbb068cb78",

"receiptHandle": "MessageReceiptHandle",

"body": "Hello from SQS!",

...

}

]

}

END RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0

REPORT RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0Duration: 198.50 msBilled Duration: 200 msMemory Size: 512 MBMax Memory Used: 90 MBInit Duration: 524.75 ms

Java 运行时记录每次调用的 START、END 和 REPORT 行。报告行提供了以下详细信息:

报告日志

RequestId – 调用的唯一请求 ID。

Duration (持续时间) – 函数的处理程序方法处理事件所花费的时间。

Billed Duration (计费持续时间) – 针对调用计费的时间量。

Memory Size (内存大小) – 分配给函数的内存量。

Max Memory Used (最大内存使用量) – 函数使用的内存量。

Init Duration (初始持续时间) – 对于提供的第一个请求,为运行时在处理程序方法外部加载函数和运行代码所花费的时间。

XRAY TraceId – 对于跟踪的请求,为 AWS X-Ray 跟踪 ID。

SegmentId – 对于跟踪的请求,为 X-Ray 分段 ID。

Sampled (采样) – 对于跟踪的请求,为采样结果。

使用 Lambda 控制台

调用 Lambda 函数后,您可以使用 Lambda 控制台查看日志输出。有关更多信息,请参阅访问 Amazon CloudWatch 的 AWS Lambda 日志。

使用 CloudWatch 控制台

您可以使用 Amazon CloudWatch 控制台查看所有 Lambda 函数调用的日志。

在 CloudWatch 控制台中查看日志

在 CloudWatch 控制台中打开 Log groups (日志组) 页面。

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

创建日志流。

每个日志流对应一个函数实例。日志流会在您更新 Lambda 函数以及创建更多实例来处理多个并发调用时显示。要查找特定调用的日志,建议您使用具有 AWS X-Ray 的函数。X-Ray 会在跟踪中记录有关请求和日志流的详细信息。

如需使用将日志和跟踪与 X-Ray 相关联的示例应用程序,请参阅 AWS Lambda 错误处理器示例应用程序。

使用 AWS Command Line Interface (AWS CLI)

AWS 命令行界面 (AWS CLI) 是一种开源工具,它使您能够使用命令行 shell 中的命令与 AWS 服务交互。要完成本部分中的步骤,您需要以下满足以下条件:

您可以通过 AWS CLI,使用 --log-type 命令选项检索调用的日志。响应包含一个 LogResult 字段,其中包含多达 4KB 来自调用的 Base64 编码日志。

例 检索日志 ID

以下示例说明如何从 LogResult 字段中检索名为 my-function 的函数的日志 ID。aws lambda invoke --function-name my-function out --log-type Tail

您应看到以下输出:{

"StatusCode": 200,

"LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",

"ExecutedVersion": "$LATEST"

}

例 解码日志

在同一命令提示符下,使用 base64 实用程序解码日志。以下示例说明如何为 my-function 检索 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: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

base64 实用程序在 Linux、macOS 和 Ubuntu on Windows 上可用。macOS 用户可能需要使用 base64 -D。

例 get-logs.sh 脚本

在同一命令提示符下,使用以下脚本下载最后五个日志事件。此脚本使用 sed 从输出文件中删除引文,并休眠 15 秒以等待日志可用。输出包括来自 Lambda 的响应,以及来自 get-log-events 命令的输出。

复制以下代码示例的内容并将其作为 get-logs.sh 保存在 Lambda 项目目录中。#!/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

例 macOS 和 Linux(仅限)

在同一命令提示符下,macOS 和 Linux 用户可能需要运行以下命令以确保脚本可执行。chmod -R 755 get-logs.sh

例 检索最后五个日志事件

在同一命令提示符下,运行以下脚本以获取最后五个日志事件。$ ./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: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",

"ingestionTime": 1559763018353

}

],

"nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",

"nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"

}

删除日志

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

使用 Log4j 2 和 SLF4J 进行高级日志记录

要自定义日志输出、在单元测试期间支持日志记录以及记录 AWS 开发工具包调用,请将 Apache Log4j 2 与 SLF4J 结合使用。Log4j 是 Java

程序的日志库,这些程序使您能够配置日志级别和使用 Appender 库。SLF4J 是一个 Facade 库,可让您更改您使用的库,而不更改函数代码。

要将请求 ID 添加到函数的日志中,请使用 aws-lambda-java-log4j2 库中的 Appender。以下示例显示向所有日志添加时间戳和请求 ID 的 Log4j 2 配置文件。

%d{yyyy-MM-dd HH:mm:ss} %X{AWSRequestId} %-5p %c{1} - %m%n

使用此配置,每行都会在前面加上日期、时间、请求 ID、日志级别和类名。

例 Appender 的日志格式

START RequestId: 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 Version: $LATEST

2020-03-18 08:52:43 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 INFO Handler - ENVIRONMENT VARIABLES:

{

"_HANDLER": "example.Handler",

"AWS_EXECUTION_ENV": "AWS_Lambda_java8",

"AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",

...

}

2020-03-18 08:52:43 6bc28136-xmpl-4365-b021-0ce6b2e64ab0 INFO Handler - CONTEXT:

{

"memoryLimit": 512,

"awsRequestId": "6bc28136-xmpl-4365-b021-0ce6b2e64ab0",

"functionName": "java-console",

...

}

SLF4J 是一个用于在 Java 代码中进行日志记录的 Facade 库。在函数代码中,您可以使用 SLF4J 记录器工厂,通过适用于日志级别(info() 和 warn())的方法来检索记录器。在构建配置中,您可以在类路径中包含日志记录库和 SLF4J 适配器。通过更改构建配置中的库,您可以在不更改函数代码的情况下更改记录器类型。SLF4J

需要从 适用于 Java 的开发工具包 中捕获日志。

在以下示例中,处理程序类使用 SLF4J 检索记录器。

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

// Handler value: example.Handler

public class Handler implements RequestHandler{

private static final Logger logger = LoggerFactory.getLogger(Handler.class);

Gson gson = new GsonBuilder().setPrettyPrinting().create();

LambdaAsyncClient lambdaClient = LambdaAsyncClient.create();

@Override

public String handleRequest(SQSEvent event, Context context)

{

String response = new String();

// call Lambda API

logger.info("Getting account settings");

CompletableFuture accountSettings =

lambdaClient.getAccountSettings(GetAccountSettingsRequest.builder().build());

// log execution details

logger.info("ENVIRONMENT VARIABLES: {}", gson.toJson(System.getenv()));

...

构建配置接受 Lambda Appender 和 SLF4J 适配器上的运行时依赖项以及 Log4J 2 上的实现依赖项。

dependencies {

implementation platform('software.amazon.awssdk:bom:2.10.73')

implementation platform('com.amazonaws:aws-xray-recorder-sdk-bom:2.4.0')

implementation 'software.amazon.awssdk:lambda'

implementation 'com.amazonaws:aws-xray-recorder-sdk-core'

implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-core'

implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2'

implementation 'com.amazonaws:aws-xray-recorder-sdk-aws-sdk-v2-instrumentor'

implementation 'com.amazonaws:aws-lambda-java-core:1.2.1'

implementation 'com.amazonaws:aws-lambda-java-events:3.1.0'

implementation 'com.google.code.gson:gson:2.8.6'

implementation 'org.apache.logging.log4j:log4j-api:2.13.0'

implementation 'org.apache.logging.log4j:log4j-core:2.13.0'

runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.13.0'

runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0'

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'

testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0'

}

当您在本地运行您的代码进行测试时,带有 Lambda 记录器的上下文对象不可用,并且没有请求 ID 供 Lambda Appender 使用。有关测试配置示例,请参阅下一节中的示例应用程序。

日志记录代码示例

本指南的 GitHub 存储库包括演示如何使用各种日志记录配置的示例应用程序。每个示例应用程序都包含用于轻松部署和清理的脚本、一个 AWS SAM 模板和支持资源。

Java 中的示例 Lambda 应用程序

blank-java – 一个 Java 函数,用于显示 Lambda 的 Java 库、日志记录、环境变量、层、AWS X-Ray 跟踪、单元测试和 AWS 开发工具包的使用情况。

java-basic – 具有单元测试和可变日志记录配置的最小 Java 函数。

java-events – 一个最小的 Java 函数,它将 aws-lambda-java-events 库与不需要 AWS 开发工具包作为依赖项的事件类型(例如 Amazon API Gateway)结合使用。

java-events-v1sdk – 一个 Java 函数,它将 aws-lambda-java-events 库与需要 AWS 开发工具包作为依赖项的事件类型(Amazon Simple Storage Service (Amazon S3)、Amazon DynamoDB

和 Amazon Kinesis)结合使用。

s3-java – 一个 Java 函数,它处理来自 Amazon S3 的通知事件,并使用 Java 类库 (JCL) 从上传的图像文件创建缩略图。

java-basic 示例应用程序显示支持日志记录测试的最小日志记录配置。处理程序代码使用上下文对象提供的 LambdaLogger 记录器。对于测试,应用程序使用一个自定义 TestLogger 类,此类实现带有 Log4j 2 记录器的 LambdaLogger 接口。它使用 SLF4J 作为 Facade 以与 AWS 开发工具包兼容。从构建输出中排除日志记录库,以使部署程序包保持较小。

blank-java 示例应用程序基于具有 AWS 开发工具包日志记录和 Lambda Log4j 2 Appender 的基本配置而构建。它使用 Lambda 中的 Log4j 2

和自定义 Appender,该 Appender 将调用请求 ID 添加到每行。

java log日志函数_Java 中的 AWS Lambda 函数日志记录 - AWS Lambda相关推荐

  1. java数据类型的转换函数_JAVA中常用数据类型转换函数

    JAVA中常用数据类型转换函数: string->byte Byte static byte parseByte(String s) byte->string Byte static St ...

  2. java math 函数_Java中Math类常用函数总结

    Java中比较常用的几个数学公式的总结: //取整,返回小于目标函数的最大整数,如下将会返回-2 Math.floor(-1.8): //取整,返回发育目标数的最小整数 Math.ceil() //四 ...

  3. java addcallback函数_java中怎么使用callback函数?

    UYOU 在很多场景,作为开发都会想到,在执行完毕一个任务的时候,能执行一个callback函数是多么好的事情.现在模拟一下这个情景:定义三个类.分别是主函数类.callback函数的接口类.业务处理 ...

  4. java 调用matlab函数_java中调用Matlab的函数+注意事项

    一.matlab版本必须支持java 在command 模式下面运行deploytool,如果支持该命令即可使用 二.matlab中function的书写 %定义一个函数operation(a,b), ...

  5. java 字符分割函数_java中的字符串分割函数

    Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面是string.split的用法实例及注意事项: java.lang.string.split split ...

  6. java拆分电话号码的函数_java中split拆分字符串函数用法

    package com.java.lang; public class StringSp { /** * @param args */ public static void main(String[] ...

  7. JAVA的gettime函数_java中Date的getTime()函数

    今天在处理facebook的json时间时,遇到了一个问题,整整困扰了一下午,吃完饭才想出来. facebook给的时间格式"yyyy-MM-ddTHH:mm:ss+0000" 要 ...

  8. java 什么是参数_java中参数是什么?

    java中参数是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中参数是什么? 参数分为实参和形参.方法名 ...

  9. python transpose函数_numpy中transpose和swapaxes函数讲解

    1 transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数. 我们看如下一个numpy的数组: arr=np.arange(16).reshape( ...

  10. html中text函数,text函数 excel中如何使用text函数

    如果我们需要将期数和日期进行合并的话,就需要用到这test函数.当然有许多人对着一个函数,肯定是第一次看到,自然也不知道这一个函数的具体使用方法.而今天我们要了解的内容就是这一个函数的具体使用方法. ...

最新文章

  1. HikariCP为什么自己造了一个FastList?
  2. 面试5家公司,我发现这80道面试题最好用,直中要害
  3. 数据结构实验之二叉树七:叶子问题
  4. 北风设计模式课程---13、享元模式
  5. 【深度学习】在PyTorch中使用 LSTM 进行新冠病例预测
  6. String大小转换函数
  7. 带你了解zabbix整合ELK收集系统异常日志触发告警~
  8. C++学习之路 | PTA乙级—— 1046 划拳 (15 分)(精简)
  9. poj 2945 Find the Clones 用trie树实现
  10. 在ECS系统中使用IJobChunk作业
  11. torch.cat() 函数用法
  12. 为什么应尽量从列表的尾部进行元素的增加与删除操作?
  13. LINUX安装cuDNN
  14. 转:Python yield 使用浅析
  15. hadoop3.3.0集群搭建(详细教程)
  16. 赠人玫瑰,手有余香,分享五款黑科技软件
  17. 使用手机模拟NFC加密门禁卡
  18. 云渲染和渲染农场的区别,什么是真正的云渲染
  19. 电脑蓝屏黑屏无法开机.BIOS更新.进不去系统只能重装?驱动人生解决方案
  20. Android Hawk数据库的源码解析,Github开源项目,基于SharedPreferences的的存储框架

热门文章

  1. python tkinter treeview_Python tkinter treeview列大小
  2. 您的DI框架正在杀死您的代码
  3. 金山快盘使用的一些注意
  4. 股票网站数据可视化,成为赌神不再是梦!!!
  5. ECCV2020 | 论文阅读——Arbitrary-Oriented Object Detection with Circular Smooth Label
  6. 判断点在多边形的内外
  7. springboot阿里云视频点播服务实现上传视频和删除功能
  8. QQ空间小秘书 V1.13 beta3~~ 天空原创软件
  9. 树莓派安装synology_如何从Synology NAS安装(和删除)应用程序包
  10. 【Kotlin 初学者】为什么要学Kotlin