

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

# 设置 Managed Service for Apache Flink 中的应用程序日志记录
<a name="cloudwatch-logs"></a>

通过在 Apache Flink 托管服务应用程序中添加 Amazon CloudWatch 日志选项，您可以监控应用程序事件或配置问题。

本主题介绍如何配置您的应用程序以将应用程序事件写入 CloudWatch 日志流。 CloudWatch 日志选项是应用程序设置和权限的集合，您的应用程序使用这些设置和权限来配置将应用程序事件写入 CloudWatch 日志的方式。您可以使用 AWS 管理控制台 或 AWS Command Line Interface (AWS CLI) 添加和配置 CloudWatch 日志记录选项。

请注意以下有关向应用程序添加 CloudWatch 日志记录选项的注意事项：
+ 使用控制台添加 CloudWatch 日志选项时，适用于 Apache 的托管服务 Flink 会为您创建 CloudWatch 日志组和日志流，并添加应用程序写入日志流所需的权限。
+ 使用 API 添加 CloudWatch 日志记录选项时，还必须创建应用程序的日志组和日志流，并添加应用程序写入日志流所需的权限。

## 使用控制台设置 CloudWatch 日志
<a name="cloudwatch-logs-console"></a>

当您在控制台中为应用程序启用 CloudWatch 日志记录功能时，将为您创建 CloudWatch 日志组和日志流。此外，还会使用写入到流的权限更新应用程序的权限策略。

适用于 Apache 的托管服务 Flink 使用以下约定创建一个命名的日志组，其中*ApplicationName*是您的应用程序的名称。

```
/aws/kinesis-analytics/ApplicationName
```

Managed Service for Apache Flink使用以下名称在新日志组中创建一个日志流。

```
kinesis-analytics-log-stream
```

您可以使用**配置应用程序**页面的**监控日志级别**部分来设置应用程序监控指标级别和监控日志级别。有关应用程序日志级别的信息，请参阅[控制应用程序监控级别](#cloudwatch_levels)。

## 使用 CLI 设置 CloudWatch 日志
<a name="cloudwatch-logs-api"></a>

要使用添加 CloudWatch 日志记录选项 AWS CLI，请完成以下操作：
+ 创建 CloudWatch 日志组和日志流。
+ 使用操作创建应用程序时添加日志记录选项，或者使用[CreateApplication](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html)操作向现有应用程序添加日志记录选项。[AddApplicationCloudWatchLoggingOption](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html)
+ 在应用程序的策略中添加权限以写入到日志。

### 创建 CloudWatch 日志组和日志流
<a name="cloudwatch-logs-api-create"></a>

您可以使用 CloudWatch 日志控制台或 API 创建 CloudWatch 日志组并进行流式传输。有关创建 CloudWatch 日志组和日志流的信息，请参阅[使用日志组和日志流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

### 使用应用程序 CloudWatch 日志选项
<a name="adding_cloudwatch"></a>

使用以下 API 操作向新应用程序或现有应用程序添加 CloudWatch 日志选项或更改现有应用程序的日志选项。有关如何将 JSON 文件用于 API 操作输入的信息，请参阅 [Managed Service for Apache Flink API 示例代码](api-examples.md)。

#### 在创建应用程序时添加 CloudWatch 日志选项
<a name="add_cloudwatch_create"></a>

以下示例演示了在创建应用程序时如何使用`CreateApplication`操作添加 CloudWatch 日志选项。在示例中，将 *Amazon Resource Name (ARN) of the CloudWatch Log stream to add to the new application* 替换为您自己的信息。有关该操作的更多信息，请参阅 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html)。

```
{
    "ApplicationName": "test",
    "ApplicationDescription": "test-application-description",
    "RuntimeEnvironment": "FLINK-1_15",
    "ServiceExecutionRole": "arn:aws:iam::123456789123:role/myrole",
    "ApplicationConfiguration": {
        "ApplicationCodeConfiguration": {
            "CodeContent": {
                "S3ContentLocation":{
                              "BucketARN": "arn:aws:s3:::amzn-s3-demo-bucket",
                              "FileKey": "myflink.jar"
                }
            },
            "CodeContentType": "ZIPFILE"
        }
    },
    "CloudWatchLoggingOptions": [{
      "LogStreamARN": "<Amazon Resource Name (ARN) of the CloudWatch log stream to add to the new application>"
	}]
}
```

#### 向现有应用程序添加 CloudWatch 日志选项
<a name="add_to_existing_app"></a>

以下示例演示如何使用`AddApplicationCloudWatchLoggingOption`操作向现有应用程序添加 CloudWatch 日志选项。在示例中，用您自己的信息替换每个*user input placeholder*信息。有关该操作的更多信息，请参阅 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_AddApplicationCloudWatchLoggingOption.html)。

```
{
   "ApplicationName": "<Name of the application to add the log option to>",
   "CloudWatchLoggingOption": { 
      "LogStreamARN": "<ARN of the log stream to add to the application>"
   },
   "CurrentApplicationVersionId": <Version of the application to add the log to>
}
```

#### 更新现有 CloudWatch 日志选项
<a name="update_existing"></a>

以下示例演示如何使用`UpdateApplication`操作修改现有的 CloudWatch 日志选项。在示例中，用您自己的信息替换每个*user input placeholder*信息。有关该操作的更多信息，请参阅 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html)。

```
{
   "ApplicationName": "<Name of the application to update the log option for>",
   "CloudWatchLoggingOptionUpdates": [ 
         { 
            "CloudWatchLoggingOptionId": "<ID of the logging option to modify>",
            "LogStreamARNUpdate": "<ARN of the new log stream to use>"
         }
      ],
   "CurrentApplicationVersionId": <ID of the application version to modify>
}
```

#### 从应用程序中删除 CloudWatch 日志选项
<a name="delete-log"></a>

以下示例演示如何使用`DeleteApplicationCloudWatchLoggingOption`操作删除现有 CloudWatch 日志选项。在示例中，用您自己的信息替换每个*user input placeholder*信息。有关该操作的更多信息，请参阅 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationCloudWatchLoggingOption.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_DeleteApplicationCloudWatchLoggingOption.html)。

```
{
   "ApplicationName": "<Name of application to delete log option from>",
   "CloudWatchLoggingOptionId": "<ID of the application log option to delete>",
   "CurrentApplicationVersionId": <Version of the application to delete the log option from>
}
```

#### 设置应用程序日志记录级别
<a name="cloudwatch-level"></a>

要设置应用程序日志记录级别，请使用 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 操作的 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfiguration.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfiguration.html) 参数或 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 操作的 [https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html) 参数。

有关应用程序日志级别的信息，请参阅[控制应用程序监控级别](#cloudwatch_levels)。

##### 在创建应用程序时设置应用程序日志记录级别
<a name="cloudwatch-level-create"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_CreateApplication.html) 操作的以下示例请求将应用程序日志级别设置为 `INFO`。

```
{
   "ApplicationName": "MyApplication",                    
   "ApplicationDescription": "My Application Description",
   "ApplicationConfiguration": {
      "ApplicationCodeConfiguration":{
      "CodeContent":{
        "S3ContentLocation":{
          "BucketARN":"arn:aws:s3:::amzn-s3-demo-bucket",
          "FileKey":"myflink.jar",
          "ObjectVersion":"AbCdEfGhIjKlMnOpQrStUvWxYz12345"
        }
      },
      "CodeContentType":"ZIPFILE"
      },
      "FlinkApplicationConfiguration": 
         "MonitoringConfiguration": { 
            "ConfigurationType": "CUSTOM",
            "LogLevel": "INFO"
         }
      },
   "RuntimeEnvironment": "FLINK-1_15",
   "ServiceExecutionRole": "arn:aws:iam::123456789123:role/myrole"
}
```

##### 更新应用程序日志记录级别
<a name="cloudwatch-level-update"></a>

[https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html](https://docs.aws.amazon.com/managed-service-for-apache-flink/latest/apiv2/API_UpdateApplication.html) 操作的以下示例请求将应用程序日志级别设置为 `INFO`。

```
{
   "ApplicationConfigurationUpdate": {
      "FlinkApplicationConfigurationUpdate": { 
         "MonitoringConfigurationUpdate": { 
            "ConfigurationTypeUpdate": "CUSTOM",
            "LogLevelUpdate": "INFO"
         }
      }
   }
}
```

### 添加写入 CloudWatch 日志流的权限
<a name="enable_putlogevents"></a>

适用于 Apache Flink 的托管服务需要写入配置错误的权限。 CloudWatch您可以将这些权限添加到适用于 Apache Flink 的托管服务 AWS Identity and Access Management (IAM) 角色中。

有关使用Managed Service for Apache Flink的 IAM 角色的更多信息，请参阅[Amazon Managed Service for Apache Flink 的身份和访问管理](security-iam.md)。

#### 信任策略
<a name="enable_putlogevents_trust_policy"></a>

要授权Managed Service for Apache Flink担任 IAM 角色，您可以将以下信任策略附加到服务执行角色。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "kinesisanalytics.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

#### 权限策略
<a name="enable_putlogevents_permissions_policy"></a>

要向应用程序授予 CloudWatch 从 Apache Flink 托管服务 Flink 资源写入日志事件的权限，您可以使用以下 IAM 权限策略。为您的日志组和直播提供正确的 Amazon 资源名称 (ARNs)。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "Stmt0123456789000",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:123456789012:log-group:my-log-group:log-stream:my-log-stream*",
                "arn:aws:logs:us-east-1:123456789012:log-group:my-log-group:*",
                "arn:aws:logs:us-east-1:123456789012:log-group:*"
            ]
        }
    ]
}
```

------

## 控制应用程序监控级别
<a name="cloudwatch_levels"></a>

您可以使用应用程序的*监控指标级别*和*监控日志级别*，以控制生成应用程序日志消息的过程。

应用程序的监控指标级别控制日志消息的粒度。监控指标级别定义如下：
+ **应用程序**：指标范围是整个应用程序。
+ **任务**：指标范围是每个任务。有关任务的信息，请参阅[实施 Managed Service for Apache Flink 中的应用程序扩展](how-scaling.md)。
+ **操作符**：指标范围是每个操作符。有关操作符的信息，请参阅[使用 API 在 Apache Flink 托管服务中使用运算符转换数据 DataStream](how-operators.md)。
+ **并行度**：指标范围是应用程序并行度。您只能使用 [ UpdateApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_UpdateApplication.html)API 的[ MonitoringConfigurationUpdate](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_MonitoringConfigurationUpdate.html)参数设置此指标级别。您无法使用控制台设置此指标级别。有关并行度的信息，请参阅[实施 Managed Service for Apache Flink 中的应用程序扩展](how-scaling.md)。

应用程序的监控日志级别控制应用程序日志的详细程度。监控日志级别定义如下：
+ **错误**：应用程序的潜在灾难性事件。
+ **警告**：应用程序的可能有害情况。
+ **信息**：应用程序的信息性和暂时性故障事件。我们建议您使用该日志记录级别。
+ **调试**：对调试应用程序非常有用的精细信息性事件。*注意*：仅将该级别用于临时调试目的。

## 应用日志记录最佳实践
<a name="cloudwatch_bestpractices"></a>

我们建议您的应用程序使用**信息**日志记录级别。我们建议您使用该级别，以确保您看到 Apache Flink 错误，这些错误是在**信息**级别而不是**错误**级别记录的。

我们建议您仅在调查应用程序问题时临时使用**调试**级别。在解决问题后，请切换回**信息**级别。使用**调试**日志记录级别将严重影响应用程序的性能。

过多的日志记录也可能会严重影响应用程序性能。例如，我们建议您不要为每个处理的记录写入一个日志条目。过多的日志记录可能会导致严重的数据处理瓶颈，并且可能会导致从源中读取数据时出现反向压力。

## 执行日志记录故障排除
<a name="cloudwatch_troubleshooting"></a>

如果没有将应用程序日志写入到日志流，请验证以下内容：
+ 验证应用程序的 IAM 角色和策略是否正确。应用程序的策略需要具有以下权限以访问日志流：
  + `logs:PutLogEvents`
  + `logs:DescribeLogGroups`
  + `logs:DescribeLogStreams`

  有关更多信息，请参阅 [添加写入 CloudWatch 日志流的权限](#enable_putlogevents)。
+ 验证应用程序是否正在运行。要检查应用程序的状态，请在控制台中查看应用程序的页面，或者使用[DescribeApplication](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_DescribeApplication.html)或[ListApplications](https://docs.aws.amazon.com/managed-flink/latest/apiv2/API_ListApplications.html)操作。
+ 监控 CloudWatch 指标`downtime`，例如诊断其他应用程序问题。有关读取 CloudWatch 指标的信息，请参阅[Managed Service for Apache Flink 中的指标和维度](metrics-dimensions.md)。

## 使用 CloudWatch 日志见解
<a name="cloudwatch_next"></a>

在应用程序中启用 CloudWatch 日志记录功能后，您可以使用 CloudWatch Logs Insights 来分析您的应用程序日志。有关更多信息，请参阅 [使用 “日志见解” 分析 CloudWatch 日志](cloudwatch-logs-reading.md)。