布林值、比較、數值、日期時間和其他函數 - Amazon CloudWatch Logs

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

布林值、比較、數值、日期時間和其他函數

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 命令,也可以作為其他函數的引數使用。

運算子 描述

=

等於

!=

不等於

<

小於

>

大於

<=

小於或等於

>=

大於或等於

數值運算子

數值運算接受數值資料類型作為引數,並傳回數值結果。數值運算可用於 filterfields 命令,也可以作為其他函數的引數使用。

作業 結果類型 描述

abs(a: 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

平方根

結構類型

地圖或清單是 CloudWatch Logs 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"
範例:空白結果

針對字串、數字和日期時間函數,地圖和清單會被視為 null。

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

比較映射和清單到任何其他欄位會導致 false

注意

stats 不支援在 dedupsort、 和 pattern中使用地圖和清單。

日期時間函數

日期時間函數

日期時間函數可用於 fieldsfilter 命令,也可以作為其他函數的引數使用。如果查詢中使用了彙總函數,您可以使用這些函數來建立時段。使用由數字和下列其中一項組成的時段:

  • ms 毫秒

  • s 持續 秒

  • m 持續 分鐘

  • h 持續 小時

例如,10m 是 10 分鐘,1h 是 1 小時。

注意

為您的日期時間函數使用最適當的時間單位。 CloudWatch 日誌會根據您選擇的時間單位限制您的請求。例如,它以 60 為上限,做為任何使用 之請求的最大值s。因此,如果您指定 bin(300s), CloudWatch Logs 實際上會將其實作為 60 秒,因為 60 是一分鐘的秒數,因此 CloudWatch Logs 不會搭配 使用高於 60 的數字s。若要建立 5 分鐘的儲存貯體,請bin(5m)改用 。

的上限為 ms 1000, s和 的上限為 m 60,而 的上限為 h 24。

下表列出您可以在查詢命令中使用的不同日期時間函數。該表列出了每個函式的結果類型,並包含對每個函式的說明。

提示

建立查詢命令時,您可以使用時間間隔選擇器,來選取您要查詢的時間段。例如:您可以設定 5 分鐘到 30 分鐘的間隔;1 小時、3 小時和 12 小時的間隔;或是自訂的時間範圍。您也可以在特定日期之間設定時間段。

函式 結果類型 描述

bin(period: Period)

時間戳記

@timestamp 的值四捨五入到指定時間段,然後截斷。例如,bin(5m)@timestamp 的值四捨五入至最接近的 5 分鐘。

您可以使用此操作在查詢中將多筆日誌條目分組在一起。以下範例傳回每小時的例外情況計數。

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

bin 函數支援以下時間單位和縮寫。對於包含多個字元的所有單位和縮寫,支援加上 s 來表示複數。所以 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)

時間戳記

將時間戳記截斷為指定的期間。例如,datefloor(@timestamp, 1h)@timestamp 的所有值截斷為半點小時。

dateceil(timestamp: Timestamp, period: Period)

時間戳記

將時間戳記無條件進位到指定期間,然後截斷。例如,dateceil(@timestamp, 1h)@timestamp 的所有值截斷為整點小時。

fromMillis(fieldName: number)

時間戳記

解譯輸入欄位為自 Unix epoch 以來的毫秒數,並將其轉換為時間戳記。

toMillis(fieldName: Timestamp)

number

將指定欄位中找到的時間戳記轉換為數字,代表自 Unix epoch 以來的毫秒數。例如:toMillis(@timestamp) 會將時間戳記 2022-01-14T13:18:031.000-08:00 轉換為 1642195111000

注意

目前, CloudWatch Logs Insights 不支援篩選具有人類可讀取時間戳記的日誌。

一般函數

一般函數

一般函數可用於 fieldsfilter 命令,也可以作為其他函數的引數使用。

函式 結果類型 描述

ispresent(fieldName: LogField)

Boolean

如果欄位存在,傳回 true

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

LogField

傳回清單中的第一個非空值

JSON 函式

JSON 函數

fieldsfilter命令中使用 JSON函數,並做為其他 函數的引數。

函式 結果類型 描述

jsonParse(fieldName: string)

映射 | 清單 | 空白

當輸入是JSON物件或JSON陣列的字串表示法時,傳回映射或清單。如果輸入不是其中一個表示法,則傳回空值。

jsonStringify(fieldName: string)

字串

當輸入是JSON物件或JSON陣列的字串表示法時,傳回映射或清單。如果輸入不是其中一個表示法,則傳回空值。從映射或清單資料傳回JSON字串。

IP 地址字串函數

IP 地址字串函數

IP 地址字串函數可用於 filterfields 命令,也可以作為其他函數的引數使用。

函式 結果類型 描述

isValidIp(fieldName: string)

布林值

true 如果 欄位是有效的 IPv4或 IPv6 地址,則傳回 。

isValidIpV4(fieldName: string)

boolean

true 如果 欄位是有效的IPv4地址,則傳回 。

isValidIpV6(fieldName: string)

boolean

true 如果 欄位是有效的IPv6地址,則傳回 。

isIpInSubnet(fieldName: string, subnet: string)

boolean

true 如果欄位是指定 v4 IPv4或 v6 子網路內的有效或IPv6地址,則傳回 。當您指定子網路時,請使用CIDR符號,例如 192.0.2.0/242001:db8::/32,其中 192.0.2.02001:db8::是CIDR區塊的開頭。

isIpv4InSubnet(fieldName: string, subnet: string)

boolean

true 如果欄位是指定 v4 子網路內的有效IPv4地址,則傳回 。當您指定子網路時,請使用 CIDR 表示法,例如 192.0.2.0/24 192.0.2.0是CIDR區塊的開頭。

isIpv6InSubnet(fieldName: string, subnet: string)

boolean

true 如果欄位是指定 v6 子網路內的有效IPv6地址,則傳回 。當您指定子網路時,請使用 CIDR 表示法,例如 2001:db8::/32 2001:db8::是CIDR區塊的開頭。

字串函數

字串函數

字串函數可用於 fieldsfilter 命令,也可以作為其他函數的引數使用。

函式 結果類型 描述

isempty(fieldName: string)

Number

如果欄位遺失或是空白字串,傳回 1

isblank(fieldName: string)

Number

如果欄位遺失、是空白字串或只包含空格,傳回 1

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

string

串連字串。

ltrim(str: string)

ltrim(str: string, trimChars: string)

string

如果函數沒有第二個引數,則會移除字串左側的空格。如果函數有第二個字串引數,則不會移除空格。而是從 str 左側移除 trimChars 中的字元。例如,ltrim("xyZxyfooxyZ","xyZ") 傳回 "fooxyZ"

rtrim(str: string)

rtrim(str: string, trimChars: string)

string

如果函數沒有第二個引數,則會移除字串右側的空格。如果函數有第二個字串引數,則不會移除空格。而是從 str 右側移除 trimChars 的字元。例如,rtrim("xyZfooxyxyZ","xyZ") 傳回 "xyZfoo"

trim(str: string)

trim(str: string, trimChars: string)

string

如果函數沒有第二個引數,則會移除字串兩側的空格。如果函數有第二個字串引數,則不會移除空格。而是從 str 兩側移除 trimChars 的字元。例如,trim("xyZxyfooxyxyZ","xyZ") 傳回 "foo"

strlen(str: string)

number

以 Unicode 字碼指標傳回字串的長度。

toupper(str: string)

string

將字串轉換成大寫。

tolower(str: string)

string

將字串轉換成小寫。

substr(str: string, startIndex: number)

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

string

傳回從數字引數指定的索引到字串結尾的子字串。如果函數有第二個數字引數,則是包含要擷取的子字串長度。例如,substr("xyZfooxyZ",3, 3) 傳回 "foo"

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

string

replaceValue 取代 fieldName: string 中出現的所有 searchValue

例如:函式 replace(logGroup,"smoke_test","Smoke") 搜尋欄位 logGroup 中包含字串值 smoke_test 的日誌事件,並將值替換為字串 Smoke

strcontains(str: string, searchValue: string)

number

如果 str 包含 searchValue,則傳回 1,否則傳回 0。