字段索引语法和配额 - Amazon CloudWatch Logs
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

字段索引语法和配额

您可以通过创建字段索引策略来创建字段索引。您可以创建适用于整个账户的账户级索引策略,也可以创建仅适用于单个日志组的策略。对于账户范围内的索引策略,您可以设置适用于账户中的所有日志组的索引策略。您还可以创建适用于账户中的部分日志组的账户级索引策略(按日志组名称的前缀选择)。如果在同一个账户中有多个账户级策略,则这些策略的日志组名称前缀不能重叠。

日志组级字段索引策略会覆盖账户级字段索引策略:如果创建了日志组级索引策略,则该日志组仅使用该策略,而忽略账户级策略。

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

您最多可以拥有 20 个账户级索引策略。如果您有多个账户级索引策略,并且它们按日志组名称前缀进行筛选,则其中任何两个策略都不能使用相同或重叠的日志组名称前缀。例如,如果您有一个策略筛选出以 my-log 开头的日志组,则不能再有一个字段索引策略筛选出以 my-logpprodmy-logging 开头的日志组。

如果您有一个没有名称前缀且适用于所有日志组的账户级索引策略,则无法创建其他账户级索引策略。

每个索引策略都有以下配额和限制:

  • 策略中最多可以包含 20 个字段。

  • 每个字段名称最多可以包含 100 个字符。

  • 要在日志组中创建以 @ 开头的自定义字段的索引,必须在字段名称的开头额外添加一个 @ 来指定该字段。例如,如果您的日志事件包含名为 @userId 的字段,则必须指定 @@userId 才能为此字段创建索引。

生成的字段和保留字段

CloudWatch Logs Insights 会自动在每个日志事件中生成系统字段。这些生成的字段以 @ 为前缀。有关生成的字段的更多信息,请参阅支持的日志和发现的字段

在这些生成的字段中,以下字段支持用作字段索引:

  • @logStream

  • @ingestionTime

  • @requestId

  • @type

  • @initDuration

  • @duration

  • @billedDuration

  • @memorySize

  • @maxMemoryUsed

  • @xrayTraceId

  • @xraySegmentId

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

CloudWatch Logs 会为标准日志类中的所有日志组提供默认字段索引。默认字段索引可自动用于以下字段:

  • @logStream

  • @aws.region

  • @aws.account

  • @source.log

  • traceId

默认字段索引是对您在策略中定义的任何自定义字段索引的补充。默认字段索引不计入字段索引配额。

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"