字段索引语法和配额 - Amazon CloudWatch 日志
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

  • @xraySetmentId

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

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

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

例如,您可以在此日志的字段中创建accessKeyIduserIdentity字段的索引:

{ "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"