

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

# 的日志和指标 AWS Lambda
<a name="lambda-logging-metrics"></a>

[Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 无需为工作负载管理和监控服务器，无需对应用程序的代码进行进一步配置或检测，即可自动使用 CloudWatch指标和 CloudWatch 日志。本节可帮助您了解 Lambda 所用系统的性能特征以及您的配置选择如何影响性能。它还可以帮助您记录和监控您的 Lambda 函数，以优化性能并诊断应用程序级问题。

## Lambda 函数日志
<a name="lambda-function-logging"></a>

Lambda 自动将标准输出和标准错误消息从 Lambda 函数流式传输到 CloudWatch 日志，无需记录驱动程序。Lambda 还会自动配置运行您的 Lambda 函数的容器，并将其配置为在单独的日志流中输出日志消息。

后续调用 Lambda 函数可以重复使用相同的容器并输出到相同的日志流。Lambda 还可以预置新的容器并将调用输出到新的日志流。

首次调用 Lambda 函数时，Lambda 会自动创建一个日志组。Lambda 函数可以有多个版本，您可以选择要运行的版本。Lambda 函数调用的所有日志都存储在同一个日志组中。名称无法更改，`/aws/lambda/<YourLambdaFunctionName>`格式为。在日志组中为每个 Lambda 函数实例创建一个单独的日志流。对于使用某种格式的日志流，Lambda 有一个标准的命名约定。`YYYY/MM/DD/[<FunctionVersion>]<InstanceId>`由 AWS 生成`InstanceId`，用于标识 Lambda 函数实例。

我们建议您将日志消息格式化为 JSON 格式，因为您可以使用 Logs Insights 更轻松地 CloudWatch 查询它们。也可以更轻松地对其进行过滤和导出。您可以使用日志库来简化此过程或编写自己的日志处理函数。我们建议您使用日志库来帮助格式化和分类日志消息。例如，如果您的 Lambda 函数是用 Python 编写的，则可以使用 Py [thon 日志模块](https://docs.python.org/3/library/logging.html)来记录消息并控制输出格式。Lambda 原生使用 Python 日志库来存储用 Python 编写的 Lambda 函数，您可以在 Lambda 函数中检索和自定义记录器。 AWS Labs 创建了 [AWS Lambda Powertools for Python](https://docs.powertools.aws.dev/lambda/python/2.13.0/) 开发者工具包，以便更轻松地使用冷启动等关键数据来丰富日志消息。该工具包可用于 Python、Java、Typescript 和.NET。

另一种最佳做法是使用变量设置日志输出级别，并根据环境和您的要求进行调整。除了使用的库之外，您的 Lambda 函数的代码还可能输出大量日志数据，具体取决于日志输出级别。这可能会影响您的日志记录成本并影响性能。

Lambda 允许您在不更新代码的情况下为 Lambda 函数运行时环境设置环境变量。例如，您可以创建一个`LAMBDA_LOG_LEVEL`环境变量来定义可以从代码中检索的日志输出级别。以下示例尝试检索`LAMBDA_LOG_LEVEL`环境变量并使用该值来定义日志输出。如果未设置环境变量，则默认为`INFO`级别。

```
import logging
from os import getenv

logger = logging.getLogger()
log_level = getenv("LAMBDA_LOG_LEVEL", "INFO")
level = logging.getLevelName(log_level)
logger.setLevel(level)
```

## 将日志发送到其他目的地 CloudWatch
<a name="send-logs-other-destinations"></a>

您可以使用订阅筛选条件将日志发送到其他目的地（例如，亚马逊 OpenSearch 服务或 Lambda 函数）。如果您不使用 Amazon OpenSearch 服务，则可以使用 Lambda 函数来处理日志，然后使用将其发送到您选择的 AWS 服务。 AWS SDKs

您还可以在 Lambda 函数中使用 SDKs AWS 云以外的日志目标，将日志语句直接发送到您选择的目标。如果您选择此选项，我们建议您考虑延迟、额外的处理时间、错误和重试处理以及操作逻辑与 Lambda 函数的耦合的影响。

## Lambda 函数指标
<a name="lambda-function-metrics"></a>

Lambda 允许您在不管理或扩展服务器的情况下运行代码，这几乎消除了系统级审计和诊断的负担。但是，了解您的 Lambda 函数的系统级别的性能和调用指标仍然很重要。这可以帮助您优化资源配置并提高代码性能。通过适当调整您的 Lambda 函数规模，有效监控和衡量性能可以改善用户体验并降低成本。通常，作为 Lambda 函数运行的工作负载也有需要捕获和分析的应用程序级指标。Lambda 直接支持嵌入式指标格式，以便更轻松地捕获应用程序级 CloudWatch 指标。

## 系统级指标
<a name="system-metrics-lambda"></a>

Lambda 会自动与 CloudWatch 指标集成，并为您的 [Lambda 函数提供一组标准指标](https://docs.aws.amazon.com//lambda/latest/dg/monitoring-metrics.html)。Lambda 还为每个 Lambda 函数提供了一个单独的监控控制面板，其中包含这些指标。您需要监控的两个重要指标是错误和调用错误。了解调用错误与其他错误类型之间的区别有助于您诊断和支持 Lambda 部署。

[调用错误会导致](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)您的 Lambda 函数无法运行。这些错误发生在您的代码运行之前，因此您无法在代码中实现错误处理来识别它们。相反，您应该为 Lambda 函数配置警报，以检测这些错误并通知操作和工作负载所有者。这些错误通常与配置或权限错误有关，并且可能是由于您的配置或权限更改而发生的。调用错误可能会启动重试，从而导致多次调用您的函数。

成功调用的 Lambda 函数会返回 HTTP 200 响应，即使该函数抛出了异常也是如此。您的 Lambda 函数应实现错误处理并引发异常，以便该`Errors`指标捕获和识别您的 Lambda 函数的失败运行。您应该从 Lambda 函数调用中返回格式化的响应，其中包含用于确定运行是完全、部分失败还是成功的信息。

CloudWatch 提供了 [CloudWatch Lambda 见解](https://docs.aws.amazon.com//lambda/latest/dg/monitoring-insights.html)，您可以为单个 Lambda 函数启用这些见解。Lambda Insights 收集、汇总和汇总系统级指标（例如 CPU 时间、内存、磁盘和网络使用情况）。Lambda Insights 还会收集、汇总和汇总诊断信息（例如，冷启动和 Lambda 工作程序关闭），以帮助您隔离和快速解决问题。

Lambda Insights 使用嵌入式指标格式自动向日志组发送性能信息，该`/aws/lambda-insights/`日志组带有基于您的 Lambda 函数名称的日志流名称前缀。这些性能日志事件创建的 CloudWatch 指标是自动 CloudWatch 仪表板的基础。我们建议您为性能测试和生产环境启用 Lambda Insights。Lambda Insights 创建的其他指标包括`memory_utilization`有助于正确调整 Lambda 函数的大小，从而避免为不需要的容量付费。

## 应用程序指标
<a name="application-metrics-lambda"></a>

您还可以 CloudWatch 使用嵌入式指标格式创建和捕获自己的应用程序指标。您可以利用[AWS 提供的嵌入式指标格式库](https://docs.aws.amazon.com//AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)来创建和发送嵌入式指标格式语句。 CloudWatch集成的 Lambda CloudWatch 日志记录工具配置为处理和提取格式正确的嵌入式指标格式语句。