字段索引语法和配额
您可以通过创建字段索引策略来创建字段索引。您可以创建适用于整个账户的账户级索引策略,也可以创建仅适用于单个日志组的策略。对于账户范围内的索引策略,您可以设置适用于账户中的所有日志组的索引策略。您还可以创建适用于账户中的部分日志组的账户级索引策略(按日志组名称的前缀选择)。如果在同一个账户中有多个账户级策略,则这些策略的日志组名称前缀不能重叠。
日志组级字段索引策略会覆盖账户级字段索引策略:如果创建了日志组级索引策略,则该日志组仅使用该策略,而忽略账户级策略。
日志事件与字段索引名称的匹配区分大小写。例如,字段索引 RequestId 将无法匹配包含 requestId 的日志事件。
您最多可以拥有 20 个账户级索引策略。如果您有多个账户级索引策略,并且它们按日志组名称前缀进行筛选,则其中任何两个策略都不能使用相同或重叠的日志组名称前缀。例如,如果您有一个策略筛选出以 my-log 开头的日志组,则不能再有一个字段索引策略筛选出以 my-logpprod 或 my-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"