布尔值、比较、数值、日期时间和其他函数 - Amazon CloudWatch 日志
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

布尔值、比较、数值、日期时间和其他函数

CloudWatch Logs Insights 支持查询中的许多其他操作和功能,如以下各节所述。

算术运算符

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

操作 描述

a + b

a - b

a * b

a / b

a ^ b

幂(2 ^ 3 返回 8

a % b

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

布尔运算符

使用布尔运算符 andornot

注意

仅在返回值为TRUE或的函数中使用布尔运算符FALSE

比较运算符

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

运算符 描述

=

Equal

!=

Not equal

<

Less than

>

Greater than

<=

小于或等于

>=

大于或等于

数值运算符

数值运算接受数值数据类型作为参数并返回数值结果。在 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

平方根

结构类型

地图或列表是 L CloudWatch ogs Insights 中的一种结构类型,允许您访问和使用属性进行查询。

示例:获取地图或列表

用于jsonParse将 json 字符串字段解析为地图或列表。

fields jsonParse(@message) as json_message
示例:访问属性

使用点访问运算符 (map.attribute) 访问地图中的项目。如果地图中的属性包含特殊字符,请使用反引号将属性名称括起来(map.attributes。 `special.char`)。

fields jsonParse(@message) as json_message | stats count() by json_message.status_code

使用方括号访问运算符(list [index])检索列表中特定位置的项目。

fields jsonParse(@message) as json_message | filter json_message.users[1].action = "PutDat

当密钥名称中存在特殊字符时,用反引号 (``) 将特殊字符换成反引号 (``)。

fields jsonParse(@message) as json_message | filter json_message.`user.id` = "123"
示例:空结果

对于字符串、数字和日期时间函数,地图和列表被视为空值。

fields jsonParse(@message) as json_message | display toupper(json_message)

将地图和列表与任何其他字段进行比较会得出false

注意

stats不支持在deduppatternsort、和中使用地图和列表。

日期时间函数

日期时间函数

fieldsfilter 命令中使用日期时间函数并将其用作其他函数的参数。使用这些函数为使用聚合函数的查询创建时间存储桶。使用由数字和下列项之一组成的时间段:

  • ms 代表毫秒

  • s 代表秒

  • m 代表分钟

  • h 代表小时

例如,10m 为 10 分钟,1h 为 1 小时。

注意

为日期时间函数使用最合适的时间单位。 CloudWatch 日志会根据您选择的时间单位对您的请求进行上限。例如,对于使用 s 的任何请求,它将最大值限制为 60。因此,如果您指定bin(300s), CloudWatch Logs 实际上将其实现为 60 秒,因为 60 是一分钟内的秒数,因此 CloudWatch Logs 不会使用大于 60 的数字s。要创建 5 分钟的存储桶,请改用 bin(5m)

ms 的上限为 1000,sm 的上限为 60,h 的上限为 24。

下表包含可在查询命令中使用的不同日期时间函数列表。该表列出了每个函数的结果类型,并包含对每个函数的描述。

提示

在创建查询命令时,您可以使用时间间隔选择器选择要查询的时间段。例如,您可以设置 5 到 30 分钟的时间间隔;1、3 和 12 小时间隔;或者自定义时间范围。您还可以设置特定日期之间的时间段。

函数 结果类型 描述

bin(period: Period)

Timestamp

@timestamp 的值四舍五入到指定的时间段,然后截断。例如,bin(5m)@timestamp 的值四舍五入到最近的 5 分钟。

您可以使用它将某个查询中的多个日志条目分为一组。以下示例返回每小时的异常数量。

filter @message like /Exception/ | stats count(*) as exceptionCount by bin(1h) | sort exceptionCount desc

bin 函数支持以下时间单位和缩写。对于所有包含多个字符的单位和缩写,支持添加复数形式。这样,hrhrs 都可以指定小时数。

  • millisecond ms msec

  • second s sec

  • minute m min

  • hour h hr

  • day d

  • week w

  • month mo mon

  • quarter q qtr

  • year y yr

datefloor(timestamp: Timestamp, period: Period)

Timestamp

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

dateceil(timestamp: Timestamp, period: Period)

Timestamp

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

fromMillis(fieldName: number)

Timestamp

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

toMillis(fieldName: Timestamp)

number

将在命名字段中找到的时间戳转换为表示自 Unix 纪元以来毫秒数的数字。例如,toMillis(@timestamp) 将时间戳 2022-01-14T13:18:031.000-08:00 转换为 1642195111000

注意

目前, CloudWatch Logs Insights 不支持筛选带有人类可读时间戳的日志。

常见函数

常见函数

fieldsfilter 命令中使用常规函数并将其用作其他函数的参数。

函数 结果类型 描述

ispresent(fieldName: LogField)

布尔值

如果字段存在,则返回 true

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

LogField

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

JSON 函数

JSON 函数

使用fieldsfilter命令中的JSON函数以及其他函数的参数。

函数 结果类型 描述

jsonParse(fieldName: string)

地图 | 清单 | 空

当输入是JSON对象或JSON数组的字符串表示形式时,返回地图或列表。如果输入不是表示形式之一,则返回一个空值。

jsonStringify(fieldName: string)

String

当输入是JSON对象或JSON数组的字符串表示形式时,返回地图或列表。如果输入不是表示形式之一,则返回一个空值。从地图或列表数据中返回JSON字符串。

IP 地址字符串函数

IP 地址字符串函数

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

函数 结果类型 描述

isValidIp(fieldName: string)

布尔值

true如果该字段为有效IPv4或IPv6地址,则返回。

isValidIpV4(fieldName: string)

布尔值

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

isValidIpV6(fieldName: string)

布尔值

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

isIpInSubnet(fieldName: string, subnet: string)

布尔值

true如果该字段为指定的 v4 IPv4 或 v6 子网内的有效IPv6地址或地址,则返回。指定子网时,请使用诸如192.0.2.0/24或之类的CIDR表示法2001:db8::/32,其中192.0.2.02001:db8::是CIDR区块的开头。

isIpv4InSubnet(fieldName: string, subnet: string)

布尔值

true如果该字段是指定 v4 子网内的有效IPv4地址,则返回。指定子网时,请使用诸如CIDR区块起192.0.2.0192.0.2.0/24在哪里之类的CIDR表示法。

isIpv6InSubnet(fieldName: string, subnet: string)

布尔值

true如果该字段是指定 v6 子网内的有效IPv6地址,则返回。指定子网时,请使用诸如CIDR区块起始2001:db8::/322001:db8::位置之类的CIDR表示法。

字符串函数

字符串函数

fieldsfilter 命令中使用字符串函数并将其用作其他函数的参数。

函数 结果类型 描述

isempty(fieldName: string)

数字

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

isblank(fieldName: string)

数字

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

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

字符串

连结字符串。

ltrim(str: string)

ltrim(str: string, trimChars: string)

字符串

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

rtrim(str: string)

rtrim(str: string, trimChars: string)

字符串

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

trim(str: string)

trim(str: string, trimChars: string)

字符串

如果函数没有第二个参数,它将删除字符串两端的空格。如果函数有第二个字符串参数,它将不会删除空格。相反,它会从 str 两端删除 trimChars 字符。例如,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(fieldName: string, searchValue: string, replaceValue: string)

字符串

fieldName: string 中出现的所有 searchValue 替换为 replaceValue

例如,函数 replace(logGroup,"smoke_test","Smoke") 搜索录入事件,其中字段 logGroup 包含字符串值 smoke_test,并使用字符串 Smoke 替换该值。

strcontains(str: string, searchValue: string)

number

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