CloudWatch Logs Insights 查询语法 - Amazon CloudWatch Logs
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

CloudWatch Logs Insights 查询语法

CloudWatch Logs Insights 支持您用来对日志组执行查询的查询语言。每个查询可以包含一个或多个由 Unix 式竖线字符 (|) 分隔的查询命令。

支持六个查询命令以及许多支持函数和操作,包括正则表达式、算术运算、比较操作、数字函数、日期时间函数、字符串函数和通用函数。

此外还支持注释。将忽略查询中以 # 字符开头的行。

@符号是由 CloudWatch Logs Insights 生成的。有关 CloudWatch Logs 会自动发现并生成的字段的更多信息,请参阅支持的日志和发现的字段.

CloudWatch Logs Insights 查询命令

下表列出了六个支持的查询命令以及基本示例。有关更强大的示例查询,请参阅 示例查询

命令 描述 示例

display

指定要在查询结果中显示的字段。如果您在查询中多次指定此命令,则仅使用您在最后一次的命令中指定的字段。

下面的示例使用字段@message并创建临时字段loggingTypeloggingMessage以便在查询中使用。它只过滤那些具有ERROR作为loggingType,但随后仅显示loggingMessage字段中的这些事件。

fields @message | parse @message "[*] *" as loggingType, loggingMessage | filter loggingType = "ERROR" | display loggingMessage

fields

从日志事件检索指定的字段以用于显示。

您可以使用字段命令中的函数和操作来修改要显示的字段值,并创建新字段以供查询的其余部分使用。

以下示例显示了字段foo-baraction的绝对值,以及f3f4日志组中的所有日志事件。

fields `foo-bar`, action, abs(f3-f4)

以下示例创建并显示一个临时字段opStatus. 的值opStatus每个日志条目的值的串联是OperationStatusCode字段,这些值之间有一个连字符。

fields concat(Operation, '-', StatusCode) as opStatus

filter

根据一个或多个条件筛选查询的结果。您可以使用多种运算符和表达式在filter命令。有关更多信息,请参阅在过滤器命令中匹配和正则表达式

以下示例检索字段f1f2, 和f3中返回的值超过 2000 的所有日志事件。duration字段中返回的子位置类型。

fields f1, f2, f3 | filter (duration>2000)

以下示例也是有效查询,但结果不会显示单独的字段。相反,结果显示@timestamp和所有日志数据@message字段,用于持续时间超过 2000 的所有日志事件。

filter (duration>2000)

以下示例检索字段f1f2对于所有日志事件,其中f1是否为 10 或f3超过 25。

fields f1, f2 | filter (f1=10 or f3>25)

下一个示例返回日志事件,其中字段statusCode具有值介于 200 和 299 之间。

fields f1 | filter statusCode like /2\d\d/

下一个示例返回具有statusCode” 300”、“400” 或 “500”。

fields @timestamp, @message | filter statusCode in [300,400,500]

最后一个示例返回没有Type字段中返回的值为 “foo”、“bar” 或 “1”。

fields @timestamp, @message | filter Type not in ["foo","bar",1]

stats

根据日志字段的值计算聚合统计数据。当您使用 stats 时,也可以使用 by 指定一个或多个条件,以便在计算统计数据时用于对数据进行分组。

支持若干统计运算符,包括 sum()avg()count()min()max()

以下示例计算的平均值f1,用于每个唯一值f2.

stats avg (f1) by f2

sort

对检索的日志事件排序。同时支持升序 (asc) 和降序 (desc)。

以下示例根据的值按降序对返回的事件排序f1,并显示字段f1f2, 和f3.

fields f1, f2, f3 | sort f1 desc

limit

指定查询返回的日志事件数。

您可以使用此选项将结果限制为较少的数量,以查看一小部分相关结果。您还可以使用值为介于 1000 到 10000 之间数字的 limit,将控制台中显示的查询结果行数增加到超过默认值 1000 行的数量。

如果未指定限制,则查询默认为最多显示 1000 行。

以下示例根据的值按降序对事件排序@timestamp,并显示字段f1f2按排序顺序排列的前 25 个事件。在这种情况下,排序顺序是按最近的时间戳,因此会返回最新的 25 个事件。

sort @timestamp desc | limit 25 | display f1, f2

parse

从日志字段提取数据,同时创建一个或多个您可以在查询中进一步处理的临时字段。parse同时接受 glob 表达式和正则表达式。

对于 glob 表达式,为 parse 命令提供一个常量字符串(用单引号或双引号括起来的字符),其中每个可变文本段都用星号 (*) 替换。它们被提取到临时字段中,并按照位置顺序在 as 关键字之后给定别名。

在正则表达式两旁加上正斜杠 (/)。在表达式中,要提取的匹配字符串的每个部分均包含在一个命名的捕获组中。(?<name>.*) 是一个命名的捕获组示例,其中 name 为名称,.* 为模式。

使用此单个日志行作为示例:

25 May 2019 10:24:39,474 [ERROR] {foo=2, bar=data} The error was: DataIntegrityException

以下两个parse表达式每个表达式执行以下操作:临时字段levelconfig, 和exception被创建。level具有值:ERRORconfig具有值:{foo=2, bar=data}, 和exception具有值:DataIntegrityException. 第一个示例使用 glob 表达式,第二个示例使用正则表达式。

parse @message "[*] * The error was: *" as level, config, exception
parse @message /\[(?<level>\S+)\]\s+(?<config>\{.*\})\s+The error was: (?<exception>\S+)/

以下示例使用正则表达式从日志字段 @message 提取临时字段 user2method2latency2,并针对 method2user2 的每个唯一组合返回平均延迟。

parse @message /user=(?<user2>.*?), method:(?<method2>.*?), latency := (?<latency2>.*?)/ | stats avg(latency2) by method2, user2

有关上一表中查询命令的注意事项

以下规则、准则和提示适用于上表中的查询命令。

  • 在查询中命名的具有除 @ 符号、句点 (.) 和字母数字字符之外字符的任何日志字段都必须用反引号 (`) 字符括起来。例如,foo-bar 字段名称必须用反引号字符括起来,因为它包含非字母数字字符。

  • 二者fieldsdisplay用于指定要在查询结果中显示的字段。两者之间的差异如下所示:

    • 您可以使用display命令来指定要在结果中显示的字段。您可以使用fields命令作为关键字使用函数和日志事件中的字段创建新的临时字段。例如,fields ispresent(resolverArn) as isRes创建一个名为isRes,它可以在查询的其余部分中使用。的值isRes是 0 或 1,具体取决于是否resolverArn是日志事件中发现的字段。

    • 如果您有多个fields命令,并且不包含display命令中指定的字段,则在fields commands are displayed.

    • 如果您有多个display命令中指定的字段,仅返回最终display command are displayed.

在过滤器命令中匹配和正则表达式

您可以使用比较运算符(=,! =、<、<=、>、>=)、布尔运算符 (andor, 和not)和正则表达式filter命令。

您可以使用 in 测试集合成员资格。将包含待检查元素的数组紧跟在 in 之后。您可以将 notin 结合使用。字符串匹配使用in必须是完整的字符串匹配。

要按子字符串进行筛选,您可以使用like或者=~(等号后跟一个波浪符)filter命令。对于子字符串匹配使用like或者=~,请将子字符串括起来以匹配双引号或单引号。要执行正则表达式匹配,请将表达式括起来以匹配正斜杠。查询将仅返回与您设置的条件匹配的日志事件。

示例

以下三个示例返回 f1 中包含单词 Exception 的所有事件。前两个示例使用正则表达式。第三个示例使用子字符串匹配。所有三个示例都区分大小写。

fields f1, f2, f3 | filter f1 like /Exception/
fields f1, f2, f3 | filter f1 =~ /Exception/
fields f1, f2, f3 | filter f1 like "Exception"

以下示例将搜索 “异常” 更改为不区分大小写。

fields f1, f2, f3 | filter f1 like /(?i)Exception/

以下示例使用正则表达式。它返回 f1 恰好是单词 Exception 的所有事件。查询不区分大小写。

fields f1, f2, f3 | filter f1 =~ /^(?i)Exception$/

在查询中使用别名

您可以使用 as 在查询中创建一个或多个别名。fieldsstatssort 命令中支持别名。

您可以为日志字段以及操作和函数的结果创建别名。

示例

以下示例说明在查询命令中使用别名。

fields abs(myField) as AbsoluteValuemyField, myField2

myField 的绝对值返回为 AbsoluteValuemyField,还返回字段 myField2

stats avg(f1) as myAvgF1 | sort myAvgF1 desc

f1 值的平均值计算为 myAvgF1 并按值的降序将它们返回。

在查询中使用注释

您可以在查询中使用 # 字符注释掉行。将忽略以 # 字符开头的行。这可用于记录您的查询或暂时对某个调用忽略复杂查询的一部分,而不删除该行。

在以下示例中,将忽略查询的第二行。

fields @timestamp, @message # | filter @message like /delay/ | limit 20

支持的操作和功能

此查询语言支持多种类型的操作和函数,如下面的表中所示。

比较操作

您可以在 filter 命令中使用比较运算并将其用作其他函数的参数。比较运算接受所有数据类型作为参数,并返回布尔值结果。

= != < <= > >=

布尔运算符

您可以使用布尔运算符 andornot。您只能在返回布尔值的函数中使用这些布尔运算符。

算术运算

您可以在 filterfields 命令中使用算术运算并将其用作其他函数的参数。算术运算接受数值数据类型作为参数并返回数值结果。

操作 描述

a + b

a - b

a * b

a / b

a ^ b

幂。2 ^ 3 返回 8

a % b

余额或模数。10 % 3 返回 1

数值运算

您可以在 filterfields 命令中使用数值运算并将其用作其他函数的参数。数值运算接受数值数据类型作为参数并返回数值结果。

操作 结果类型 描述

abs(a: number)

number

绝对值。

ceil(a: number)

number

舍入到上限(大于 a 的值的最小整数)。

floor(a: number)

number

舍入到下限(小于 a 的值的最大整数)。

greatest(a: number, ...numbers: number[])

number

返回最大值。

least(a: number, ...numbers: number[])

number

返回最小值。

log(a: number)

number

自然对数。

sqrt(a: number)

number

平方根。

常规函数

您可以在 filterfields 命令中使用常规函数并将其用作其他函数的参数。

函数 结果类型 描述

ispresent(fieldName: LogField)

布尔值

如果字段存在,则返回 true

coalesce(fieldName: LogField, ...fieldNames: LogField[])

日志字段

返回列表中的第一个非 null 值。

字符串函数

您可以在 filterfields 命令中使用字符串函数并将其用作其他函数的参数。

函数 结果类型 描述

isempty(fieldName: string)

布尔值

如果字段缺失或为空字符串,则返回 true

isblank(fieldName: string)

布尔值

如果字段缺失或为空字符串,或只包含空格,则返回 true

concat(str: string, ...strings: string[])

字符串

连结字符串。

ltrim(str: string)

ltrim(str: string, trimChars: string)

字符串

如果函数没有第二个参数,它将从字符串左侧删除空格。如果函数具有第二个字符串参数,它不会删除空格。相反,它会删除trimChars从左侧str. 例如,ltrim("xyZxyfooxyZ","xyZ") 将返回 "fooxyZ"

rtrim(str: string)

rtrim(str: string, trimChars: string)

字符串

如果函数没有第二个参数,它将从字符串右侧删除空格。如果函数具有第二个字符串参数,它不会删除空格。相反,它会删除trimChars从右侧str. 例如,rtrim("xyZfooxyxyZ","xyZ") 将返回 "xyZfoo"

trim(str: string)

trim(str: string, trimChars: string)

字符串

如果函数没有第二个参数,它将从字符串两端删除空格。如果函数具有第二个字符串参数,它不会删除空格。相反,它会删除trimChars从两侧str. 例如,trim("xyZxyfooxyxyZ","xyZ") 将返回 "foo"

strlen(str: string)

number

返回 Unicode 代码点中字符串的长度。

toupper(str: string)

字符串

将字符串转换为大写。

tolower(str: string)

字符串

将字符串转换为小写。

substr(str: string, startIndex: number)

substr(str: string, startIndex: number, length: number)

字符串

返回从由数值参数指定的索引到字符串末尾的子字符串。如果该函数具有二个参数,它包含要检索的子字符串的长度。例如,substr("xyZfooxyZ",3, 3) 将返回 "foo"

replace(str: string, searchValue: string, replaceValue: string)

字符串

str 中出现的所有 searchValue 替换为 replaceValue。例如,replace("foo","o","0") 将返回 "f00"

strcontains(str: string, searchValue: string)

number

如果 str 包含 searchValue,则返回 1,否则返回 0。

日期时间函数

您可以在 filterfields 命令中使用日期时间函数并将其用作其他函数的参数。您可以使用这些函数为使用聚合函数的查询创建时间存储桶。

作为日期时间函数的一部分,您可以使用包括一个数字的时间段,m 表示分钟,h 表示小时。例如,10m 为 10 分钟,1h 为 1 小时。

函数 结果类型 描述

bin(period: Period)

时间戳

@timestamp 的值舍入到指定的时间段,然后截断。

datefloor(timestamp: Timestamp, period: Period)

时间戳

将时间戳截断到指定的时间段。例如,datefloor(@timestamp, 1h)@timestamp 的所有值截断至小时底部。

dateceil(timestamp: Timestamp, period: Period)

时间戳

将时间戳向上舍入到指定的时间段,然后截断。例如,dateceil(@timestamp, 1h)@timestamp 的所有值截断至小时顶部。

fromMillis(fieldName: number)

时间戳

将输入字段解释为自 Unix 纪元以来的毫秒数并将其转换为时间戳。

toMillis(fieldName: Timestamp)

number

将在命名字段中找到的时间戳转换为表示自 Unix 纪元以来毫秒数的数字。

IP 地址函数

您可以在 filterfields 命令中使用 IP 地址字符串函数并将其用作其他函数的参数。

函数 结果类型 描述

isValidIp(fieldName: string)

布尔值

如果字段是有效的 IPv4 或 IPv6 地址,则返回 true

isValidIpV4(fieldName: string)

布尔值

如果字段是有效的 IPv4 地址,则返回 true

isValidIpV6(fieldName: string)

布尔值

如果字段是有效的 IPv6 地址,则返回 true

isIpInSubnet(fieldName: string, subnet: string)

布尔值

如果字段是指定的 v4 或 v6 子网中有效的 IPv4 或 IPv6 地址,则返回 true。指定子网时,请使用 CIDR 表示法,例如 192.0.2.0/242001:db8::/32

isIpv4InSubnet(fieldName: string, subnet: string)

布尔值

如果字段是指定的 v4 子网中有效的 IPv4 地址,则返回 true。指定子网时,请使用 CIDR 表示法,例如 192.0.2.0/24

isIpv6InSubnet(fieldName: string, subnet: string)

布尔值

如果字段是指定的 v6 子网中有效的 IPv6 地址,则返回 true。指定子网时,请使用 CIDR 表示法,例如 2001:db8::/32

统计聚合函数

您可以在 stats 命令中使用聚合函数并将其用作其他函数的参数。

函数 结果类型 描述

avg(fieldName: NumericLogField)

number

指定的字段中值的平均值。

count()

count(fieldName: LogField)

number

计算日志事件。count()(或count(*))会计算查询返回的所有事件,而count(fieldName)对包含所指定字段名称的所有记录进行计数。

count_distinct(fieldName: LogField)

number

返回字段的唯一值的数量。如果字段具有非常高的基数(包含许多唯一值),则 count_distinct 返回的值只是一个近似值。

max(fieldName: LogField)

日志字段值

所查询的日志中此日志字段的值的最大值。

min(fieldName: LogField)

日志字段值

所查询的日志中此日志字段的值的最小值。

pct(fieldName: LogFieldValue, percent: number)

日志字段值

百分位数指示某个值在数据集中的相对位置。例如,pct(@duration, 95) 返回 @duration 值,95% 的 @duration 值低于此值,5% 的值高于此值。

stddev(fieldName: NumericLogField)

number

指定的字段中值的标准偏差。

sum(fieldName: NumericLogField)

number

指定的字段中值的总和。

统计非聚合函数

您可以在 stats 命令中使用非聚合函数并将其用作其他函数的参数。

函数 结果类型 描述

earliest(fieldName: LogField)

日志字段

从查询的日志中具有最早时间戳的日志事件返回 fieldName 的值。

latest(fieldName: LogField)

日志字段

从查询的日志中具有最晚时间戳的日志事件返回 fieldName 的值。

sortsFirst(fieldName: LogField)

日志字段

返回在查询的日志中排在第一位的 fieldName 的值。

sortsLast(fieldName: LogField)

日志字段

返回在查询的日志中排在最后一位的 fieldName 的值。