

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

# 使用 Amazon OpenSearch 日志监控 CloudWatch 日志
<a name="createdomain-configure-slow-logs"></a>

亚马逊 OpenSearch 服务通过亚马逊 OpenSearch 日志公开以下日 CloudWatch 志：
+ 错误日志
+ [搜索请求慢速日志](https://opensearch.org/docs/latest/install-and-configure/configuring-opensearch/logs/#search-request-slow-logs)
+ [分片慢速日志](https://opensearch.org/docs/latest/install-and-configure/configuring-opensearch/logs/#shard-slow-logs)
+ [审核日志](audit-logs.md)

搜索分片慢速日志、索引分片慢速日志和错误日志，有助于排查性能和稳定性问题。审核日志跟踪用户活动，以达到合规性目的。所有日志默认情况下*已禁用*。如果启用，则适用[标准 CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。

**注意**  
错误日志仅适用于 OpenSearch Elasticsearch 版本 5.1 及更高版本。慢速日志适用于所有版本 OpenSearch 和 Elasticsearch 版本。

对于其日志， OpenSearch 使用 [Apache Log4j 2](https://logging.apache.org/log4j/2.x/) 及其内置日志级别（从最低到最严重）`TRACE`，、`DEBUG`、`INFO``WARN`、`ERROR`和。`FATAL`

如果您启用错误日志， OpenSearch 服务会将`WARN``ERROR`、和的日志行发布`FATAL`到 CloudWatch。 OpenSearch Service 还发布了该`DEBUG`关卡中的几个例外情况，包括：
+ `org.opensearch.index.mapper.MapperParsingException`
+ `org.opensearch.index.query.QueryShardException`
+ `org.opensearch.action.search.SearchPhaseExecutionException`
+ `org.opensearch.common.util.concurrent.OpenSearchRejectedExecutionException`
+ `java.lang.IllegalArgumentException`

错误日志在许多情况下有助于诊断，包括：
+ Painless 脚本编译问题
+ 无效的查询
+ 索引问题
+ 快照失败
+ 索引状态管理迁移失败
**注意**  
并非所有错误都会记录在错误日志中。

**注意**  
OpenSearch 服务不会记录所有发生的错误。

**Topics**
+ [启用日志发布（控制台）](#createdomain-configure-slow-logs-console)
+ [启用日志发布 (AWS CLI)](#createdomain-configure-slow-logs-cli)
+ [启用日志发布 (AWS SDKs)](#createdomain-configure-slow-logs-sdk)
+ [启用日志发布 (CloudFormation)](#createdomain-configure-slow-logs-cfn)
+ [设置搜索请求慢速日志阈值](#createdomain-configure-search-request-slow-logs)
+ [设置分片慢速日志阈值](#createdomain-configure-slow-logs-indices)
+ [测试慢速日志](#createdomain-configure-slow-logs-testing)
+ [查看日志](#createdomain-configure-slow-logs-viewing)

## 启用日志发布（控制台）
<a name="createdomain-configure-slow-logs-console"></a>

 OpenSearch 服务控制台是允许向发布日志的最简单方法 CloudWatch。

**启用向 CloudWatch （控制台）发布日志**

1. 转到 [aws.amazon.com](https://aws.amazon.com/)，然后选择**登录**，并提供您的凭证。

1. 在 “**分析**” 下，选择 “**亚马逊 OpenSearch 服务**”。

1. 选择要更新的域。

1. 在 **Logs（日志）**选项卡上，选择一种日志类型，然后选择 **Enable（启用）**。

1. 创建新的 CloudWatch 日志组或选择现有的日志组。
**注意**  
如果计划启用多个日志，建议将它们发布到相应的日志组。这样分开更便于进行日志扫描。

1. 选择一个包含适当权限的访问策略，或使用控制台提供的 JSON 创建策略：

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "Service": "es.amazonaws.com"
         },
         "Action": [
           "logs:PutLogEvents",
           "logs:CreateLogStream"
         ],
         "Resource": "arn:aws:logs:us-east-1:111122223333:log-group:cw_log_group_name:*"
       }
     ]
   }
   ```

------

   建议您在策略中使用 `aws:SourceAccount` 和 `aws:SourceArn` 条件键来防止出现[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。源帐户是域的所有者，并且源 ARN 是域的 ARN。您的域必须在服务软件 R20211203 或更高版本上才能添加这些条件键。

   例如，您可以将以下条件块添加到策略：

   ```
   "Condition": {
       "StringEquals": {
           "aws:SourceAccount": "account-id"
       },
       "ArnLike": {
           "aws:SourceArn": "arn:aws:es:region:account-id:domain/domain-name"
       }
   }
   ```
**重要**  
CloudWatch 日志支持[每个区域 10 个资源策略](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutResourcePolicy.html)。如果您计划为多个 OpenSearch 服务域启用日志，则应创建并重复使用包含多个日志组的更广泛的策略，以避免达到此限制。有关更新您的策略的步骤，请参阅[启用日志发布 (AWS CLI)](#createdomain-configure-slow-logs-cli)。

1. 请选择**启用**。

   您的域状态将从 **Active** 更改为 **Processing**。在启用日志发布之前，必须重新回到 **Active** 状态。此项更改通常需要 30 分钟，但可能需要更长时间，具体取决于您的域配置。

如果您已启用其中的一种分片慢速日志，请参阅[设置分片慢速日志阈值](#createdomain-configure-slow-logs-indices)。如果启用了审核日志，请参阅 [步骤 2：在 OpenSearch 控制面板中打开审核日志](audit-logs.md#audit-log-dashboards-ui)。如果您仅启用了错误日志，您不需要执行任何其他配置步骤。

## 启用日志发布 (AWS CLI)
<a name="createdomain-configure-slow-logs-cli"></a>

在启用日志发布之前，您需要一个 CloudWatch 日志组。如果还没有日志组，可以使用以下命令创建一个：

```
aws logs create-log-group --log-group-name my-log-group
```

输入下一命令查找日志组的 ARN，然后*将它记下来*：

```
aws logs describe-log-groups --log-group-name my-log-group
```

现在，您可以向 OpenSearch 服务授予写入日志组的权限。您必须在命令结尾处提供日志组的 ARN：

```
aws logs put-resource-policy \
  --policy-name my-policy \
  --policy-document '{ "Version": "2012-10-17",		 	 	  "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { "Service": "es.amazonaws.com"}, "Action":[ "logs:PutLogEvents","logs:CreateLogStream"],"Resource": "cw_log_group_arn:*"}]}'
```

**重要**  
CloudWatch 日志支持[每个区域 10 个资源策略](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutResourcePolicy.html)。如果您计划为多个 OpenSearch 服务域启用分片慢日志，则应创建并重复使用包含多个日志组的更广泛的策略，以避免达到此限制。

如果您以后需要查看此策略，请使用 `aws logs describe-resource-policies` 命令。要更新策略，请发出带有新策略文档的相同 `aws logs put-resource-policy` 命令。

最后，可以使用 `--log-publishing-options` 选项来启用发布。该选项的语法与 `create-domain` 和 `update-domain-config` 命令相同。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/createdomain-configure-slow-logs.html)

**注意**  
如果计划启用多个日志，建议将它们发布到相应的日志组。这样分开更便于进行日志扫描。

**示例**

下面的示例为指定域启用了发布搜索和索引分片慢速日志：

```
aws opensearch update-domain-config \
  --domain-name my-domain \
  --log-publishing-options "SEARCH_SLOW_LOGS={CloudWatchLogsLogGroupArn=arn:aws:logs:us-east-1:123456789012:log-group:my-log-group,Enabled=true},INDEX_SLOW_LOGS={CloudWatchLogsLogGroupArn=arn:aws:logs:us-east-1:123456789012:log-group:my-other-log-group,Enabled=true}"
```

要禁用发布到 CloudWatch，请使用运行相同的命令`Enabled=false`。

如果您已启用其中的一种分片慢速日志，请参阅[设置分片慢速日志阈值](#createdomain-configure-slow-logs-indices)。如果启用了审核日志，请参阅 [步骤 2：在 OpenSearch 控制面板中打开审核日志](audit-logs.md#audit-log-dashboards-ui)。如果您仅启用了错误日志，您不需要执行任何其他配置步骤。

## 启用日志发布 (AWS SDKs)
<a name="createdomain-configure-slow-logs-sdk"></a>

在启用日志发布之前，必须先创建一个 CloudWatch 日志组，获取其 ARN，并授予 OpenSearch 服务写入该组的权限。相关操作记录在《[亚马逊 CloudWatch 日志 API 参考](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/)》中：
+ `CreateLogGroup`
+ `DescribeLogGroup`
+ `PutResourcePolicy`

您可以使用访问这些操作[AWS SDKs](https://aws.amazon.com/tools/#sdk)。

 AWS SDKs （Android 和 iOS 除外 SDKs）支持《[亚马逊 OpenSearch 服务 API 参考](https://docs.aws.amazon.com/opensearch-service/latest/APIReference/Welcome.html)》中定义的所有操作，包括`CreateDomain`和`--log-publishing-options`选项`UpdateDomainConfig`。

如果您已启用其中的一种分片慢速日志，请参阅[设置分片慢速日志阈值](#createdomain-configure-slow-logs-indices)。如果您仅启用了错误日志，您不需要执行任何其他配置步骤。

## 启用日志发布 (CloudFormation)
<a name="createdomain-configure-slow-logs-cfn"></a>

在此示例中，我们使用创建名 CloudFormation 为的日志组`opensearch-logs`，分配相应的权限，然后创建一个为应用程序日志、搜索分片慢日志和索引慢日志启用日志发布功能的域。

在启用日志发布之前，您需要创建一个 CloudWatch 日志组：

```
Resources:
  OpenSearchLogGroup:
    Type: AWS::Logs::LogGroup
    Properties: 
      LogGroupName: opensearch-logs
Outputs:
  Arn:
    Value:
      'Fn::GetAtt':
        - OpenSearchLogGroup
        - Arn
```

模板将输出日志组的 ARN。在本例中，ARN 为 `arn:aws:logs:us-east-1:123456789012:log-group:opensearch-logs`。

使用 ARN 创建资源策略，授予 OpenSearch 服务写入日志组的权限：

```
Resources:
 OpenSearchLogPolicy:
   Type: AWS::Logs::ResourcePolicy
   Properties:
     PolicyName: my-policy
     PolicyDocument: "{ \"Version\": \"2012-10-17\", \"Statement\": [{ \"Sid\": \"\", \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"es.amazonaws.com\"}, \"Action\":[ \"logs:PutLogEvents\",\"logs:CreateLogStream\"],\"Resource\": \"arn:aws:logs:us-east-1:123456789012:log-group:opensearch-logs:*\"}]}"
```

最后，创建以下 CloudFormation 堆栈，该堆栈生成带有日志发布功能的 OpenSearch 服务域。访问策略允许用户 AWS 账户 向该域发出所有 HTTP 请求。

```
Resources:
  OpenSearchServiceDomain:
    Type: "AWS::OpenSearchService::Domain"
    Properties:
      DomainName: my-domain
      EngineVersion: "OpenSearch_1.0"
      ClusterConfig:
        InstanceCount: 2
        InstanceType: "r6g.xlarge.search"
        DedicatedMasterEnabled: true
        DedicatedMasterCount: 3
        DedicatedMasterType: "r6g.xlarge.search"
      EBSOptions:
        EBSEnabled: true
        VolumeSize: 10
        VolumeType: "gp2"
      AccessPolicies:
        Version: "2012-10-17"		 	 	 
        Statement:
            Effect: "Allow"
            Principal:
                AWS: "arn:aws:iam::123456789012:user/es-user"
            Action: "es:*"
            Resource: "arn:aws:es:us-east-1:123456789012:domain/my-domain/*"
      LogPublishingOptions:
        ES_APPLICATION_LOGS:
          CloudWatchLogsLogGroupArn: "arn:aws:logs:us-east-1:123456789012:log-group:opensearch-logs"
          Enabled: true
        SEARCH_SLOW_LOGS:
          CloudWatchLogsLogGroupArn: "arn:aws:logs:us-east-1:123456789012:log-group:opensearch-logs"
          Enabled: true
        INDEX_SLOW_LOGS:
          CloudWatchLogsLogGroupArn: "arn:aws:logs:us-east-1:123456789012:log-group:opensearch-logs"
          Enabled: true
```

有关详细的语法信息，请参阅 *CloudFormation 用户指南*中的[日志发布选项](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-elasticsearch-domain-logpublishingoption.html)。

## 设置搜索请求慢速日志阈值
<a name="createdomain-configure-search-request-slow-logs"></a>

[搜索请求慢速日志](https://opensearch.org/docs/latest/install-and-configure/configuring-opensearch/logs/#search-request-slow-logs)可用于在版本 2.13 及更高版本上运行的 OpenSearch 服务域上进行搜索。搜索请求慢速日志阈值是针对请求总用时配置的。这与分片请求慢速日志不同，后者是针对单个分片用时配置的。

您可以使用集群设置来指定搜索请求慢速日志。这与分片慢速日志不同，后者是使用索引设置启用的。例如，您可以通过 OpenSearch REST API 指定以下设置：

```
PUT domain-endpoint/_cluster/settings
{
  "transient": {
    "cluster.search.request.slowlog.threshold.warn": "5s",
    "cluster.search.request.slowlog.threshold.info": "2s"
  }
}
```

**注意**  
`PUT /_cluster/settings`终端节点在 Amazon OpenSearch 服务中受到限制。发送此请求将返回错误：`Your request: '/_cluster/settings' payload is not allowed.`要配置分片慢速日志阈值，请改用索引级设置。例如：  

```
PUT domain-endpoint/index/_settings
{
  "index.search.slowlog.threshold.query.warn": "5s",
  "index.search.slowlog.threshold.query.info": "2s"
}
```

## 设置分片慢速日志阈值
<a name="createdomain-configure-slow-logs-indices"></a>

OpenSearch 默认情况下禁用[分片慢日志](https://opensearch.org/docs/latest/install-and-configure/configuring-opensearch/logs/#shard-slow-logs)。启用向*发布*分片慢速日志后 CloudWatch，仍必须为每个 OpenSearch 索引指定日志阈值。这些阈值精确定义应在哪个日志级别记录哪些内容。

例如，您可以通过 OpenSearch REST API 指定以下设置：

```
PUT domain-endpoint/index/_settings
{
  "index.search.slowlog.threshold.query.warn": "5s",
  "index.search.slowlog.threshold.query.info": "2s"
}
```

## 测试慢速日志
<a name="createdomain-configure-slow-logs-testing"></a>

要测试搜索请求和分片慢速日志是否都成功发布，请考虑从非常低的值开始以验证日志是否出现在其中 CloudWatch，然后将阈值提高到更有用的级别。

如果日志没有显示，请检查以下内容：
+  CloudWatch 日志组存在吗？ 检查控制 CloudWatch 台。
+ S OpenSearch ervice 是否有权写入日志组？ 检查 OpenSearch 服务控制台。
+  OpenSearch 服务域是否配置为发布到日志组？ 检查 OpenSearch 服务控制台，使用 AWS CLI `describe-domain-config`选项，或`DescribeDomainConfig`使用其中一个来电 SDKs。
+  OpenSearch 日志阈值是否足够低，以至于您的请求超出了这些阈值？ 

  要检查某个域的搜索请求慢速日志阈值，请使用以下命令：

  ```
  GET domain-endpoint/_cluster/settings?flat_settings
  ```

  要检查某个索引的分片慢速日志阈值，请使用以下命令：

  ```
  GET domain-endpoint/index/_settings?pretty
  ```

如果要禁用索引的慢速日志，请将您更改的任何阈值恢复为其默认值 `-1`。

禁用发布到 CloudWatch 使用 OpenSearch 服务控制台或者 AWS CLI *不会*停止生成 OpenSearch 日志；它只会停止*发布*这些日志。如果不再需要分片慢速日志，请务必检查索引设置；如果不再需要搜索请求慢速日志，请务必检查域设置。

## 查看日志
<a name="createdomain-configure-slow-logs-viewing"></a>

查看应用程序和慢速登录 CloudWatch 就像查看任何其他 CloudWatch 日志一样。有关更多信息，请参阅 *Amazon 日志用户指南中的查看 CloudWatch 日志*[数据](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#ViewingLogData)。

下面是查看日志时的一些注意事项：
+ OpenSearch 服务仅向发布每行的前 255,000 个字符。 CloudWatch其余任何内容都将被截断。对于审核日志，每条消息为 10,000 个字符。
+ 在中 CloudWatch，日志流名称的后缀为`-index-slow-logs`、`-search-slow-logs``-application-logs`、和，`-audit-logs`以帮助识别其内容。