

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

# 字段索引语法和配额
<a name="CloudWatchLogs-Field-Indexing-Syntax"></a>

您可以通过创建*字段索引策略*来创建字段索引。您可以创建适用于整个账户的账户级索引策略，也可以创建仅适用于单个日志组的策略。对于账户范围内的索引策略，您可以设置适用于账户中的所有日志组的索引策略。您还可以创建适用于账户中的部分日志组的账户级索引策略（按日志组名称的前缀选择）。如果在同一个账户中有多个账户级策略，则这些策略的日志组名称前缀不能重叠。同样，您可以创建适用于特定数据源名称和类型组合的账户级索引策略。每个数据源名称和类型组合只能创建一个账户策略。

日志组级别的字段索引策略优先于账户级字段索引策略：这些策略适用于整个日志组（例如，没有选择标准或基于日志组名称前缀的选择标准的账户级策略）。除了与整个日志组匹配的策略外，还将应用在日志事件级别匹配的账户级策略（例如，针对给定的数据源名称和类型组合）。如果您创建日志组级别的索引策略，则该日志组不使用与日志组级别匹配的账户级策略。

日志事件与字段索引名称的匹配区分大小写。例如，字段索引 `RequestId` 将无法匹配包含 `requestId` 的日志事件。

您最多可以有 40 个账户级别的索引策略，其中 20 个可以使用日志组名称前缀选择标准，20 个可以使用基于数据源的选择标准。如果您有多个账户级索引策略，并且它们按日志组名称前缀进行筛选，则其中任何两个策略都不能使用相同或重叠的日志组名称前缀。例如，如果您有一个策略筛选出以 `my-log` 开头的日志组，则不能再有一个字段索引策略筛选出以 `my-logpprod` 或 `my-logging` 开头的日志组。同样，如果您有多个账户级索引策略筛选为数据源名称和类型组合，则其中任何两个策略都不能使用相同的数据源名称和类型。例如，如果您将一个策略筛选为数据源名称`amazon_vpc`和数据源类型，`flow`则无法使用此组合创建另一个策略。

如果您的账户级索引策略没有名称前缀且适用于所有日志组，则无法创建其他带有日志组名称前缀筛选器的账户级索引策略；您可以创建使用数据源名称和类型筛选器的账户级索引策略。

每个索引策略都有以下配额和限制：
+ 策略中最多可以包含 20 个字段。
+ 每个字段名称最多可以包含 100 个字符。
+ 要在日志组中创建以 `@` 开头的自定义字段的索引，必须在字段名称的开头额外添加一个 `@` 来指定该字段。例如，如果您的日志事件包含名为 `@userId` 的字段，则必须指定 `@@userId` 才能为此字段创建索引。

对于具有基于数据源名称和类型的选择标准的账户级索引策略，还有一个额外的限制：所有字段都必须是原始数据类型，只有结构支持嵌套基元。

**生成的字段和保留字段**

CloudWatch Logs Insights 会在每个日志事件中自动生成系统字段。这些生成的字段以 `@` 为前缀。有关生成的字段的更多信息，请参阅[支持的日志和发现的字段](CWL_AnalyzeLogData-discoverable-fields.md)。

在这些生成的字段中，以下字段支持用作字段索引：
+ `@logStream`
+ `@ingestionTime`
+ `@requestId`
+ `@type`
+ `@initDuration`
+ `@duration`
+ `@billedDuration`
+ `@memorySize`
+ `@maxMemoryUsed`
+ `@xrayTraceId`
+ `@xraySegmentId`

要为这些生成的字段编制索引，指定它们时无需像对以 `@` 开头的自定义字段那样添加额外的 `@`。例如，要为 `@logStream` 创建字段索引，只需将 `@logStream` 指定为字段索引即可。

CloudWatch 日志为标准日志类中的所有日志组提供默认字段索引。默认字段索引可自动用于以下字段：
+ `@logStream`
+ `@aws.region`
+ `@aws.account`
+ `@source.log`
+ `@data_source_name`
+ `@data_source_type`
+ `@data_format`
+ `traceId`
+ `severityText`
+ `attributes.session.id`

CloudWatch 日志还为某些数据源名称和类型组合提供默认字段索引。默认字段索引自动适用于以下数据源名称和类型组合：


| 数据源名称和类型 | 默认字段索引 | 
| --- | --- | 
|  `amazon_vpc.flow`  |  `action` `logStatus` `region` `flowDirection` `type`  | 
|  `amazon_route53.resolver_query`  |  `query_type` `transport` `rcode`  | 
|  `aws_waf.access`  |  `action` `httpRequest.country`  | 
|  `aws_cloudtrail.data` ` aws_cloudtrail.management`  |  `eventSource` `eventName` `awsRegion` `userAgent` `errorCode` `eventType` `managementEvent` `readOnly` `eventCategory` `requestId`  | 

默认字段索引是对您在策略中定义的任何自定义字段索引的补充。默认字段索引不计入[字段索引配额](#CloudWatchLogs-Field-Indexing-Syntax)。

**JSON 日志中的子字段和数组字段**

您可以对 JSON 日志中的嵌套子字段或数组字段编制索引。

例如，您可以在此日志的 `userIdentity` 字段中创建 `accessKeyId` 子字段的索引：

```
{
    "eventVersion": "1.0",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "EXAMPLE_PRINCIPAL_ID",
        "arn": "arn: aws: iam: : 123456789012: user/Alice",
        "accessKeyId": "11112222",
        "accountId": "123456789012",
        "userName": "Alice"
    },
    "eventTime": "2014-03-06T21: 22: 54Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "StartInstances",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "192.0.2.255",
    "userAgent": "ec2-api-tools1.6.12.2",
    "requestParameters": {
        "instancesSet": {
            "items": [{
                "instanceId": "i-abcde123",
                "currentState": {
                    "code": 0,
                    "name": "pending"
                },
                "previousState": {
                    "code": 80,
                    "name": "stopped"
                }
            }]
        }
    }
}
```

要创建此字段，在创建字段索引和在查询中指定该字段时，请使用点表示法（`userIdentity.accessKeyId`）来引用它。查询可能如下所示：

```
fields @timestamp, @message 
| filterIndex userIdentity.accessKeyId = "11112222"
```

在前面的示例事件中，`instanceId` 字段位于 `requestParameters.instancesSet.items` 中的一个数组中。为了在创建字段索引和查询时表示此字段，请将其引用为 `requestParameters.instancesSet.items.0.instanceId`。0 表示该字段在数组中的位置。

然后，此字段的查询可能如下所示：

```
fields @timestamp, @message 
| filterIndex requestParameters.instancesSet.items.0.instanceId="i-abcde123"
```