

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon ECS Service Connect 存取日誌
<a name="service-connect-envoy-access-logs"></a>

Amazon ECS Service Connect 支援存取日誌，以提供 Service Connect Proxy 處理之個別請求的詳細遙測。存取日誌透過擷取每個請求流量中繼資料來補充現有的應用程式日誌，例如 HTTP 方法、路徑、回應碼、旗標和時間資訊。這可讓對請求層級流量模式和服務互動進行更深入的可觀測性，以有效地進行故障診斷和監控。

若要啟用存取日誌，請在 `serviceConnectConfiguration` 物件中指定 `logConfiguration`和 `accessLogConfiguration` 物件。您可以設定日誌的格式，以及日誌是否應該在 中包含查詢參數`accessLogConfiguration`。日誌會由 中指定的日誌驅動程式交付至目的地日誌群組`logConfiguration`。

```
{
    "serviceConnectConfiguration": {
        "enabled": true,
        "namespace": "myapp.namespace",
        "services": [
            ...
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }
}
```

## 考量事項
<a name="service-connect-envoy-access-logs-considerations"></a>

當您啟用存取日誌的存取權時，請考慮下列事項
+ 存取日誌和應用程式日誌都會寫入 `/dev/stdout`。若要將存取日誌與應用程式日誌分開，建議使用具有自訂Fluent Bit或Fluentd組態的`awsfirelens`日誌驅動程式。
+  建議使用 `awslogs` 日誌驅動程式將應用程式和存取日誌傳送至相同的 CloudWatch 目的地。
+ 使用平台版本 `1.4.0` 和更高版本的 Fargate 服務支援存取日誌。
+ 根據預設，請求 ID 和字符等查詢參數會從存取日誌中排除。若要在存取日誌中包含查詢參數，請將 `includeQueryParameters`設定為 `"ENABLED"`。

## 存取日誌格式
<a name="service-connect-envoy-access-logs-formats"></a>

存取日誌可以使用 JSON 格式字典或文字格式字串進行格式化，不同類型存取日誌的支援命令運算子不同。

### HTTP 存取日誌
<a name="service-connect-envoy-access-logs-formats-http"></a>

HTTP 日誌預設包含下列命令運算子：

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration_ms": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%"
}
```

------

### HTTP2 存取日誌
<a name="service-connect-envoy-access-logs-formats-http2"></a>

除了 HTTP 日誌包含的命令運算子之外，HTTP2 日誌預設還包含 `%STREAM_ID%`運算子。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### gRPC 存取日誌
<a name="service-connect-envoy-access-logs-formats-grpc"></a>

除了 HTTP 日誌包含的命令運算子之外，gRPC 存取日誌預設還包含 `%STREAM_ID%`和 `%GRPC_STATUS()%`運算子。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %GRPC_STATUS()% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "grpc_status": "%GRPC_STATUS()%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### TCP 存取日誌
<a name="service-connect-envoy-access-logs-formats-tcp"></a>

根據預設，TCP 存取日誌中會包含下列命令運算子：

------
#### [ Text ]

```
[%START_TIME%] %DOWNSTREAM_REMOTE_ADDRESS% %DOWNSTREAM_REMOTE_PORT% 
%BYTES_RECEIVED% %BYTES_SENT% %DURATION%  
%CONNECTION_TERMINATION_DETAILS% %CONNECTION_ID%\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "downstream_remote_address": "%DOWNSTREAM_REMOTE_ADDRESS%",
  "downstream_remote_port": "%DOWNSTREAM_REMOTE_PORT%",s
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "connection_termination_details": "%CONNECTION_TERMINATION_DETAILS%",
  "connection_id": %CONNECTION_ID%
}
```

------

如需這些命令運算子的詳細資訊，請參閱 Envoy 文件中的[命令運算](https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#command-operators)子。

# 啟用 Amazon ECS Service Connect 的存取日誌
<a name="service-connect-access-logs-configuration"></a>

使用 Service Connect 的 Amazon ECS 服務預設不會啟用存取日誌。您可以透過下列方式啟用存取日誌。

## 使用 啟用存取日誌 AWS CLI
<a name="service-connect-access-logs-configure-cli"></a>

下列命令顯示如何在建立服務`accessLogConfiguration`時指定 AWS CLI ，以使用 啟用 Amazon ECS 服務的存取日誌：

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }'
```

## 使用主控台啟用存取日誌
<a name="service-connect-access-logs-configure-console"></a>

如需詳細的服務建立程序，請參閱[建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)。

**使用 建立具有共用命名空間的服務 AWS 管理主控台**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在**叢集**頁面上，選擇要在其中建立服務的叢集。

1. 在**服務**下選擇**建立**。

1. 根據工作負載填入其他詳細資訊後，在 **Service Connect** 區段中，選擇**使用 Service Connect**。

1. 根據您的服務類型 （用戶端或用戶端伺服器） 視需要設定 Service Connect 設定。

1. 展開**存取日誌組態**。針對**格式**，選擇 **JSON** 或 `TEXT`。

1. 若要在存取日誌中包含查詢參數，請選取**包含查詢參數**。

1. 完成服務建立程序。