

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

# 日志记录
<a name="envoy-logs"></a>

**重要**  
终止支持通知：2026 年 9 月 30 日， AWS 将停止对的支持。 AWS App Mesh 2026 年 9 月 30 日之后，您将无法再访问 AWS App Mesh 控制台或 AWS App Mesh 资源。有关更多信息，请访问此博客文章[从迁移 AWS App Mesh 到 Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)。

创建虚拟节点和虚拟网关时，您可以选择配置 Envoy 访问日志。在控制台中，这位于虚拟节点和虚拟网关创建或编辑工作流程的**日志记录**部分中。

![\[Logging configuration interface showing HTTP access logs path field with example path.\]](http://docs.aws.amazon.com/zh_cn/app-mesh/latest/userguide/images/logging.png)


上图显示了 Envoy 访问日志 `/dev/stdout` 的日志记录路径。

对于`format`，请指定两种可能的格式**之一**，`json` *或* `text`和模式。`json` 获取密钥对并将其转换为 JSON 结构，然后再将其传递给 Envoy。

以下代码块显示了可在 AWS CLI中使用的 JSON 表示形式。

```
      "logging": { 
         "accessLog": { 
            "file": { 
               "path": "/dev/stdout",
                "format" : { 
                    // Exactly one of json or text should be specified
                    "json": [ // json will be implemented with key pairs
                        {
                            "key": "string",
                            "value": "string"
                        }
                    ]
                    "text": "string" //e.g. "%LOCAL_REPLY_BODY%:%RESPONSE_CODE%:path=%REQ(:path)%\n"
                }
            }
         }
      }
```

**重要**  
请务必检查您的输入模式是否对 Envoy 有效，否则 Envoy 将拒绝更新并将最新的更改存储在 `error state` 中。

当您向 `/dev/stdout` 发送 Envoy 访问日志时，它们会与 Envoy 容器日志混在一起。您可以使用标准 Docker 日志驱动程序将它们导出到 CloudWatch 日志存储和处理服务（例如 Logs`awslogs`）中。有关更多信息，请参阅《Amazon ES3 开发人员指南》中的[使用 awslogs 日志驱动程序](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html)。要仅导出 Envoy 访问日志（而忽略其他 Envoy 容器日志），可以 `ENVOY_LOG_LEVEL` 将设置为 `off`。您可以通过包含格式字符串 `%REQ_WITHOUT_QUERY(X?Y):Z%` 来记录不带查询字符串的请求。有关示例，请参阅[`ReqWithoutQuery` 格式化程序](https://www.envoyproxy.io/docs/envoy/latest/api-v3/extensions/formatter/req_without_query/v3/req_without_query.proto)。有关更多信息，请参阅 Envoy 文档中的[访问日志记录](https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/access_log.html)。

**在 Kubernetes 上启用访问日志**  
使用[适用于 Kubernetes 的 App Mesh Controller ](https://docs.aws.amazon.com/app-mesh/latest/userguide/mesh-k8s-integration.html)时，您可以通过将日志配置添加到虚拟节点规范中，为虚拟节点配置访问日志，如以下示例所示。

```
---
apiVersion: appmesh.k8s.aws/v1beta2
kind: VirtualNode
metadata:
  name: virtual-node-name
  namespace: namespace
spec:
  listeners:
    - portMapping:
        port: 9080
        protocol: http
  serviceDiscovery:
    dns:
      hostName: hostname
  logging:
    accessLog:
      file:
        path: "/dev/stdout"
```

您的集群必须有日志转发器才能收集这些日志，例如 Fluentd。有关更多信息，请参阅将 [Fluentd 设置为 DaemonSet 向日志发送日志。 CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-setup-logs.html)

Envoy 还会将各种调试日志从其过滤器写入 `stdout`。这些日志对于深入了解 Envoy 与 App Mesh 的通信和 service-to-service流量非常有用。可以使用 `ENVOY_LOG_LEVEL` 环境变量配置您的特定日志级别。例如，以下文本来自调试日志示例，该日志显示 Envoy 为特定 HTTP 请求匹配的集群。

```
[debug][router] [source/common/router/router.cc:434] [C4][S17419808847192030829] cluster 'cds_ingress_howto-http2-mesh_color_client_http_8080' match for URL '/ping'
```

## Firelens 和 Cloudwatch
<a name="firelens-cloudwatch-logging"></a>

[Firelens](https://aws.amazon.com/about-aws/whats-new/2019/11/aws-launches-firelens-log-router-for-amazon-ecs-and-aws-fargate/#:~:text=FireLens%20is%20a%20container%20log,for%20log%20analytics%20and%20storage.&text=This%20means%20you%20can%20use,your%20own%20Fluentd%20output%20plugin.) 是一款容器日志路由器，你可以用它来收集 Amazon ECS 的日志。 AWS Fargate您可以在我们的示例存储库中找到使用 Firelens 的[AWS 示例](https://github.com/aws-samples/amazon-ecs-firelens-examples)。

您可以使用 CloudWatch 来收集日志信息和指标。您可以在 App Mesh 文档的[导出指标](https://docs.aws.amazon.com/app-mesh/latest/userguide/metrics.html#cloudwatch)部分 CloudWatch 中找到更多信息。