

# 使用 Amazon ECS Action Logs 进行问题排查
<a name="action-logs-troubleshooting"></a>

操作日志通过提供有关 Amazon ECS 服务所发起操作的详细记录，来帮助诊断问题。每个日志条目均包含时间戳、日志级别、事件名称以及详细有效载荷，以及有关所发生事件及其原因的上下文信息。本主题涵盖常见的问题排查场景，并提供可直接使用的 CloudWatch Logs Insights 查询。

## 了解日志级别
<a name="action-logs-troubleshooting-log-levels"></a>

操作日志使用三个日志级别来指示每个事件的严重度：

`INFO`  
正常操作，例如部署已启动、任务已启动或资源已预置。这些事件表明 Amazon ECS 正在按预期执行操作。

`WARN`  
可能需要注意的非严重问题，例如重试尝试或容量约束。Amazon ECS 继续取得进展，但操作所需的时间可能比预期要长。

`ERROR`  
需要采取措施的故障，例如部署失败、预置错误或任务启动受损。查看这些事件以确定根本原因并采取纠正措施。

**提示**  
首先筛选 `ERROR` 或 `WARN` 日志级别，以快速识别问题。然后可以将搜索范围扩展至 `INFO` 事件，以获取更多上下文信息。

## 调试失败的服务部署
<a name="action-logs-troubleshooting-failed-deployment"></a>

部署停滞或已自动回滚。

筛选 `eventName` 包含 `DEPLOYMENT` 的 `ERROR` 日志。检查 `detail` 有效载荷，以获取部署 ARN、状态原因和失败任务计数。

以下示例展示了一种无可用回滚候选项的部署失败场景：

```
{
  "resourceArn": "arn:aws:ecs:us-east-1:111122223333:cluster/my-cluster",
  "actionSourceId": "service/my-cluster/my-service",
  "logLevel": "ERROR",
  "eventTimestamp": 1784573730986,
  "detail": {
    "statusReason": "No rollback candidate was found to run the rollback.",
    "serviceDeploymentArn": "arn:aws:ecs:us-east-1:111122223333:service-deployment/my-cluster/my-service/abc123def456",
    "status": "FAILED",
    "eventName": "SERVICE_DEPLOYMENT_ROLLBACK_FAILED"
  }
}
```

检查 `detail.statusReason` 字段，以确定任务失败的原因。使用以下 CloudWatch Logs Insights 查询来查找所有部署错误：

```
fields @timestamp, detail.statusReason
| filter logLevel = "ERROR" and detail.deploymentArn like /{{my-cluster}}\/{{my-service}}/
| sort @timestamp desc
| limit 20
```

## 诊断托管式进程守护程序问题
<a name="action-logs-troubleshooting-daemon"></a>

进程守护程序无法在实例上启动或进程守护程序部署停滞。

按进程守护程序 ARN 筛选日志，以查找与您的进程守护程序相关的事件。此外还可以按 `logLevel` 进行筛选，将结果范围缩小为警告或错误。

以下示例展示了由于目标实例内存不足而无法启动的进程守护程序任务：

```
{
  "timestamp": 1719500050000,
  "logLevel": "WARN",
  "account": "123456789012",
  "region": "us-east-1",
  "resourceArn": "arn:aws:ecs:us-east-1:123456789012:cluster/my-cluster",
  "actionSourceId": "arn:aws:ecs:us-east-1:123456789012:daemon/my-cluster/my-logging-daemon",
  "eventName": "DAEMON_TASK_START_IMPAIRED",
  "detail": {
    "statusReason": "RESOURCE:MEMORY - Unable to place daemon task on container instance: insufficient memory",
    "containerInstanceArn": "arn:aws:ecs:us-east-1:123456789012:container-instance/my-cluster/a1b2c3d4"
  }
}
```

验证目标实例是否有足够的资源来运行进程守护程序任务。如果实例正在耗尽，进程守护程序可能要等到新实例可用后才能启动。使用以下查询筛选特定进程守护程序的事件：

```
fields @timestamp, logLevel, detail.statusReason
| filter actionSourceId like /{{my-logging-daemon}}/
| filter logLevel in ["ERROR", "WARN"]
| sort @timestamp desc
| limit 20
```

## 了解进程守护程序任务停止的原因
<a name="action-logs-troubleshooting-daemon-task-stops"></a>

进程守护程序任务意外停止。

筛选包含进程守护程序任务失败详细信息的 `WARN` 和 `ERROR` 日志。`detail` 有效载荷中的以下字段提供了有关进程守护程序任务停止原因的信息：

`detail.stopCode`  
一种机器可读代码，用于对任务停止的原因进行分类。

`detail.statusReason`  
有关任务停止原因的人类可读格式描述。并非所有日志条目中都存在此字段。

`detail.containerStoppedReason`  
有关导致任务停止的特定容器的其他上下文信息。

有关任务停止代码及其描述的完整列表，请参阅 [Amazon ECS 已停止任务错误消息](stopped-task-error-codes.md)。

**注意**  
预期的进程守护程序任务停止（例如 `UserInitiated`）会从操作日志中剔除。您只会看到非预期的或与错误相关的进程守护程序任务停止。

## 实用的 CloudWatch Logs Insights 查询
<a name="action-logs-troubleshooting-queries"></a>

可使用以下 CloudWatch Logs Insights 查询来调查 Amazon ECS 服务的常见问题。

**过去一小时内的所有错误**

```
fields @timestamp, logLevel, eventName, detail.statusReason
| filter logLevel = "ERROR"
| sort @timestamp desc
| limit 50
```

**注意**  
并非所有日志条目中都存在 `detail.statusReason` 字段。如果结果中该字段为空，请使用 `detail` 有效载荷中的 `eventName` 及其他字段获取上下文信息。

**特定服务的事件**

```
fields @timestamp, logLevel, detail.statusReason
| filter @message like /{{my-service}}/
| sort @timestamp desc
| limit 50
```

**特定部署的部署时间线**

```
fields @timestamp, logLevel, detail.statusReason
| filter detail.deploymentArn like /{{my-cluster}}\/{{my-service}}\/{{abc123}}/
| sort @timestamp asc
```

**按原因分组的进程守护程序任务失败**

```
filter logLevel = "ERROR" and detail.stopCode != ""
| stats count(*) as failureCount by detail.stopCode, detail.statusReason
| sort failureCount desc
| limit 20
```