CloudWatch Logs Insights のクエリ構文 - Amazon CloudWatch Logs

CloudWatch Logs Insights のクエリ構文

CloudWatch Logs Insights では、クエリ言語を使用してロググループに対するクエリの実行します。クエリ構文は、一般的な関数、算術演算と比較演算、正規表現など、さまざまな関数とオペレーションをサポートしています。複数のコマンドを含むクエリを作成します。コマンドはパイプ文字 (|) で区切ります。コメントを含むクエリを作成します。ハッシュ文字 (#) を使用してコメントを開始します。

注記

CloudWatch Logs Insights は、さまざまなログタイプのフィールドを自動で検出し、@ 文字で始まるフィールドを生成します。これらのフィールドの詳細については、「Amazon CloudWatch ユーザーガイド」の「サポートされるログと検出されるフィールド」を参照してください。

CloudWatch Logs Insights クエリコマンド

このセクションには、CloudWatch Logs Insights のサポートされているクエリコマンドのリストが含まれています。

注記

このセクションのサンプルクエリは、すべてのログタイプで機能するわけではありません。クエリとその他のログタイプの一般的なクエリの例については、「サンプルクエリ」を参照してください。

display

display コマンドを使用して、クエリ結果の特定のフィールドを表示します。

例: 1 つのフィールドを表示する

サンプルクエリは、@message フィールドからデータを抽出し、エフェメラルフィールド loggingType および loggingMessage を作成します。クエリは、loggingType の値が ERROR であるログイベントを返し、クエリ結果に loggingMessage の値のみを表示します。

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

例: 複数のフィールドを表示する

display コマンドで複数のフィールドを指定できます。クエリの例は、クエリ結果の loggingTypeloggingMessage の値を示しています。

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

ベストプラクティスとして、display コマンドはクエリで 1 回だけ使用してください。クエリで display コマンドを 2 回以上使用すると、クエリの結果には、使用されている display コマンドの直近の実行で指定されたフィールドが表示されます。

fields

fields コマンドを使用して、クエリ結果の特定のフィールドを表示します。

例: 特定のフィールドを表示する

次のクエリは、20 個のログイベントを返し、降順で表示します。@timestamp@message の値がクエリ結果に表示されます。

fields @timestamp, @message | sort @timestamp desc | limit 20
ヒント

display コマンドを使用したくない場合は、このコマンドを使用してください。fields コマンドは、フィールド値を変更したり、クエリで使用できる新しいフィールドを作成したりするためのさまざまな機能やオペレーションをサポートしています。

filter

filter コマンドを使用して、1 つ以上の条件に一致するログイベントを取得します。

例: 1 つの条件を使用してログイベントをフィルタリングする

次のクエリは、range の値が 3000 より大きいログイベントを返します。このクエリは、結果を 20 個のログイベントに制限し、ログイベントを @timestamp 別に降順で並べ替えます。

fields @timestamp, @message | filter (range>3000) | sort @timestamp desc | limit 20

例: 複数の条件を使用してログイベントをフィルタリングする

キーワード and および or を使用して、複数の条件を組み合わせることができます。

次のクエリは、range の値が 3000 より大きく、accountId の値が 798312420998 に等しいログイベントを返します。前のクエリと同様に、このクエリは、結果を 20 個のログイベントに制限し、ログイベントを @timestamp 別に降順で並べ替えます。

fields @timestamp, @message | filter (range>3000 and accountId=9876543210) | sort @timestamp desc | limit 20

stats

stats コマンドを使用して、ログフィールド値で集約統計を計算します。

sort

sort コマンドを使用して、ログイベントを昇順 (asc) または降順 (desc) で表示します。

limit

limit コマンドを使用して、クエリで返すログイベントの数を指定します。

parse

parse コマンドを使用して、ログフィールドからデータを抽出し、クエリで処理できるエフェメラルフィールドを作成します。

クエリコマンドを操作するためのガイドライン

クエリで指定されたログフィールドで、@ 記号、ピリオド (.)、英数字以外の文字を含むものは、バッククォートキー (`) で囲む必要があります。例えば、ログフィールド foo-bar では英数字以外の文字であるハイフン (`foo-bar`) が含まれているため、バッククォート (-) で囲む必要があります。

display コマンドを使用して、クエリの結果で表示させたいフィールドを表示します。display コマンドは、指定したフィールドだけを表示します。クエリに複数の display コマンドが含まれている場合、クエリ結果には、最後の display コマンドで指定したフィールドのみが表示されます。

fields コマンドを as キーワードと共に使用すると、ログイベント内の関数とフィールドを使用してエフェメラルフィールドを作成できます。例えば、fields ispresent as isRes はクエリの残りの部分で使用できる isRes という名前のエフェメラルフィールドを作成します。

isRes の値は 0 か 1 のどちらかになり、resolverArn が検出されたフィールドであるかどうかによって変わります。クエリに複数の fields コマンドがあり、display コマンドが含まれない場合は、fields コマンドで指定されたすべてのフィールドが表示されます。

フィルターコマンドの一致と正規表現

フィルターコマンドは、正規表現の使用をサポートします。以下の比較演算子 (=!=<<=>>=) とブール演算子 (andor、および not) を使用できます。

注記

ユーザーが正規表現に精通していることを前提としています。CloudWatch Logs Insights は、複数の正規表現マッチングライブラリである Hyperscan をサポートしています。ハイパースキャンの詳細については、ハイパースキャンのウェブサイトを参照してください。

キーワード in を使用して集合要素関係をテストし、配列内の要素をチェックできます。配列の要素をチェックするには、in の後に対象の配列を配置します。ブール演算子 not および in を使用できます。in を使用するクエリを作成して、フィールドに文字列の一致があるログイベントを返すことができます。フィールドは完全な文字列でなければなりません。例えば、次のコードスニペットは、フィールド logGroup が完全な文字列 example_group であるログイベントを返すために in を使用するクエリを示しています。

fields @timestamp, @message | filter logGroup in ["example_group"]

キーワードフレーズ like および not like を使用して、部分文字列を一致させることができます。正規表現の演算子 =~ を使用して部分文字列を一致させることができます。like および not like で部分文字列を一致させるには、単一引用符または二重引用符で一致させたい部分文字列を囲みます。正規表現パターンは、like および not like と共に使用できます。部分文字列を正規表現の演算子と一致させるには、一致させたい部分文字列をスラッシュで囲みます。次の例には、filter コマンドを使用して部分文字列を照合する方法を示すコードスニペットが含まれます。

例: 部分文字列の一致

以下の例では、f1 に単語 Exception が含まれているログイベントを返します。これら 3 つの例すべてで、大文字と小文字が区別されます。

最初の例では、部分文字列を like と一致させます。

fields f1, f2, f3 | filter f1 like "Exception"

2 番目の例では、部分文字列を like および正規表現パターンと一致させます。

fields f1, f2, f3 | filter f1 like /Exception/

最後の例では、部分文字列を正規表現と一致させます。

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

例: 部分文字列をワイルドカードと一致させる

アスタリスク記号 (*) を正規表現のワイルドカードとして使用して、部分文字列に一致させることができます。次の例は、f1 に文字 E で始まる単語が含まれているログイベントを返します。この例では大文字と小文字が区別されます。

fields f1, f2, f3 | filter f3 like /E*/
注記

アスタリスク記号の前にピリオドを置いて (.*)、できるだけ多くの一致を返す貪欲な量指定子を作成することができます。

例: 一致から部分文字列を除外する

次の例は、f1Exception という単語が含まれないログイベントを返すクエリを示しています。この例では大文字と小文字が区別されます。

fields f1, f2, f3 | filter f1 not like "Exception"

例: 大文字と小文字を区別しないパターンで部分文字列を一致させる

大文字と小文字を区別しない部分文字列を、like および正規表現と一致させることができます。次のパラメータ (?i) を、一致させる部分文字列の前に配置します。次の例は、f1 に単語 Exception または exception が含まれるログベントを返すクエリを示しています。

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

クエリでのエイリアスの使用

エイリアスを含むクエリを作成します。ログフィールドの名前を変更するために、またはエフェメラルフィールドに値を抽出する場合にエイリアスを使用します。キーワード as を使用して、ログフィールドまたは結果にエイリアスを指定します。クエリ内で複数のエイリアスを使用できます。次のコマンド内でエイリアスを使用できます。

  • fields

  • parse

  • sort

  • stats

次の例では、エイリアスを含むクエリを作成する方法を示します。

クエリの fields コマンドはエイリアスを含みます。

fields @timestamp, @message, accountId as ID | sort @timestamp desc | limit 20

クエリは、フィールド @timestamp@message、および accountId の値を返します。結果は降順でソートされ、20 に制限されます。ID の値は、エイリアス accountId の下に一覧表示されます。

クエリの sort および stats コマンドはエイリアスを含みます。

stats count(*) by duration as time | sort time desc

クエリは、ロググループでフィールド duration が発生した回数をカウントし、結果を降順で並べ替えます。duration の値は、エイリアス time の下に一覧表示されます。

クエリでのコメントの使用

CloudWatch Logs Insights は、クエリ内でのコメントをサポートしています。ハッシュ文字 (#) を使用してコメントを開始します。コメントを使用して、クエリまたはドキュメントクエリの行を無視できます。

例: クエリ

次のクエリを実行すると、2 行目は無視されます。

fields @timestamp, @message, accountId # | filter accountId not like "7983124201998" | sort @timestamp desc | limit 20

サポートされているオペレーションと関数

CloudWatch Logs Insights は次のオペレーションと関数をサポートしています。

算術演算子

算術演算子は、数値データ型を引数として受け入れ、数値結果を返します。算術演算子は、filter コマンドと fields コマンドで使用します。また、他の関数の引数としても使用します。

Operation 説明

a + b

加算

a - b

減算

a * b

乗算

a / b

除算

a ^ b

指数 (2 ^ 38 を返します)

a % b

残余または剰余 (10 % 31 を返します)

ブール演算子

ブール演算子 andor、および not を使用します。

注記

ブール演算子は、TRUE または FALSE の値を返す関数でのみ使用します。

比較演算子

比較演算子は、すべてのデータ型を引数として受け入れ、ブール値の結果を返します。比較オペレーションは、filter コマンドで使用します。また、他の関数の引数としても使用します。

演算子 説明

=

等しい

!=

等しくない

<

未満

>

<=

以下

>=

以上

数値演算子

数値オペレーションは、数値データ型を引数として受け入れ、数値結果を返します。数値オペレーションは、filter コマンドと fields コマンドで使用します。また、他の関数の引数としても使用します。

Operation 結果タイプ 説明

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

平方根

日時関数

日時関数は、fields コマンドと filter コマンドで使用します。また、他の関数の引数としても使用します。これらの関数では、集計関数を使用してクエリの時間バケットを作成します。数字と m (分) または h (時間) で構成される期間を使用します。たとえば、10m は 10 分、1h は 1 時間です。次の表は、クエリコマンドで使用できるさまざまな日付時刻関数のリストを示したものです。このリストには、各関数の結果タイプと説明が記載されています。

ヒント

クエリコマンドを作成するときに、時間間隔セレクタを使用してクエリの対象とする期間を選択できます。例えば、5~30 分間隔、1 時間、3 時間、12 時間間隔、またはカスタム時間枠の期間を設定できます。また、特定の日付の間で期間を指定することもできます。

関数 結果タイプ 説明

bin(period: Period)

タイムスタンプ

@timestamp の値を特定の期間に切り上げ、次に切り詰めます。例えば、bin(5m)@timestamp の値を切り詰める前に、5 分刻みで四捨五入を行います。

datefloor(timestamp: Timestamp, period: Period)

タイムスタンプ

タイムスタンプを特定の期間に切り詰めます。たとえば、datefloor(@timestamp, 1h)@timestamp のすべての値を 1 時間の下限に切り詰めます。

dateceil(timestamp: Timestamp, period: Period)

タイムスタンプ

タイムスタンプを特定の期間に切り上げ、次に切り詰めます。たとえば、dateceil(@timestamp, 1h)@timestamp のすべての値を 1 時間の上限に切り詰めます。

fromMillis(fieldName: number)

タイムスタンプ

入力フィールドを Unix エポックからのミリ秒数として解釈し、タイムスタンプに変換します。

toMillis(fieldName: Timestamp)

数値

指定されたフィールドで見つかったタイムスタンプを、Unix エポックからのミリ秒を表す数値に変換します。例えば、toMillis(@timestamp) はタイムスタンプを 2022-01-14T13:18:031.000-08:00 から 1642195111000 に変換します。

注記

現在、CloudWatch Logs Insights では、可読性のあるタイムスタンプが記録されているログのフィルタリングをサポートしていません。

一般関数

一般関数は、fields コマンドと filter コマンドで使用します。また、他の関数の引数としても使用します。

関数 結果タイプ 説明

ispresent(fieldName: LogField)

ブール値

フィールドが存在する場合は true を返します

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

LogField

リストから最初の null でない値を返します

IP アドレス文字列関数

IP アドレス文字列関数は、filter コマンドと fields コマンドで使用します。また、他の関数の引数としても使用します。

関数 結果タイプ 説明

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 を返します。サブネットを指定するときは、 192.0.2.0/242001:db8::/32 などの CIDR 表記を使用します。

isIpv4InSubnet(fieldName: string, subnet: string)

ブール型

指定された v4 サブネット内でフィールドが有効な IPv4 アドレスである場合、true を返します。サブネットを指定する場合は、192.0.2.0/24 などの CIDR 表記を使用します。

isIpv6InSubnet(fieldName: string, subnet: string)

ブール型

指定された v6 サブネット内でフィールドが有効な IPv6 アドレスである場合、true を返します。サブネットを指定する場合は、2001:db8::/32 などの CIDR 表記を使用します。

統計集計関数

集約関数は、stats コマンドで使用します。また、他の関数の引数としても使用します。

関数 結果タイプ 説明

avg(fieldName: NumericLogField)

数値

指定したフィールドの値の平均。

count()

count(fieldName: LogField)

数値

ログイベントをカウントします。count() (または count(*)) は、クエリによって返されたすべてのイベントをカウントし、count(fieldName) は指定されたフィールド名を含むすべてのレコードをカウントします。

count_distinct(fieldName: LogField)

数値

フィールドの一意な値の数を返します。このフィールドの濃度が非常に高い場合 (一意な値が多数含まれている場合)、count_distinct から返される値は単なる概算値です。

max(fieldName: LogField)

LogFieldValue

クエリを実行したログにおける、このログフィールドの値の最大数。

min(fieldName: LogField)

LogFieldValue

クエリを実行したログにおける、このログフィールドの値の最小数。

pct(fieldName: LogFieldValue, percent: number)

LogFieldValue

パーセンタイルは、データセットにおける値の相対的な位置を示します。たとえば、pct(@duration, 95)@duration 値を返した場合、@duration の値の 95% がこの値より低く、5% がこの値より高くなります。

stddev(fieldName: NumericLogField)

数値

指定されたフィールドの値の標準偏差。

sum(fieldName: NumericLogField)

数値

指定したフィールドの値の合計。

統計非集計関数

非集約関数は、stats コマンドで使用します。また、他の関数の引数としても使用します。

関数 結果タイプ 説明

earliest(fieldName: LogField)

LogField

クエリを実行したうち最も早いタイムスタンプがあるログイベントから fieldName の値を返します。

latest(fieldName: LogField)

LogField

クエリを実行したうち最も遅いタイムスタンプがあるログイベントから fieldName の値を返します。

sortsFirst(fieldName: LogField)

LogField

クエリを実行したログをソートすると最初に来る fieldName の値を返します。

sortsLast(fieldName: LogField)

LogField

クエリを実行したログをソートすると最後に来る fieldName の値を返します。

文字列関数

文字列関数は、fields コマンドと filter コマンドで使用します。また、他の関数の引数としても使用します。

関数 結果タイプ 説明

isempty(fieldName: string)

数値

フィールドが欠落しているか、空の文字列である場合、1 を返します。

isblank(fieldName: string)

数値

フィールドが欠落しているか、空の文字列であるか、空白が含まれている場合、1 を返します。

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

文字列

複数の文字列を連結します。

ltrim(str: string)

ltrim(str: string, trimChars: string)

文字列

関数に 2 番目の文字列引数がない場合、文字列の左側からホワイトスペースを削除します。関数に 2 番目の文字列引数がある場合、ホワイトスペースは削除されません。その場合、strの左から trimChars 個の文字が削除されます。たとえば、ltrim("xyZxyfooxyZ","xyZ")"fooxyZ" を返します。

rtrim(str: string)

rtrim(str: string, trimChars: string)

文字列

関数に 2 番目の文字列引数がない場合、文字列の右側からホワイトスペースを削除します。関数に 2 番目の文字列引数がある場合、ホワイトスペースは削除されません。その場合、strの右から trimChars 個の文字が削除されます。たとえば、rtrim("xyZfooxyxyZ","xyZ")"xyZfoo" を返します。

trim(str: string)

trim(str: string, trimChars: string)

文字列

関数に 2 番目の文字列引数がない場合、文字列の両方の端からホワイトスペースを削除します。関数に 2 番目の文字列引数がある場合、ホワイトスペースは削除されません。その場合、strの両方から trimChars 個の文字が削除されます。たとえば、trim("xyZxyfooxyxyZ","xyZ")"foo" を返します。

strlen(str: string)

数値

文字列の長さを Unicode コードポイントで返します。

toupper(str: string)

文字列

文字列を大文字に変換します。

tolower(str: string)

文字列

文字列を小文字に変換します。

substr(str: string, startIndex: number)

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

文字列

数値引数で指定されたインデックスから文字列の末尾までの部分文字列を返します。関数に 2 番目の数値引数がある場合、この引数には取得される部分文字列の長さが含まれます。たとえば、substr("xyZfooxyZ",3, 3)"foo" を返します。

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

文字列

searchValuefieldName: string のすべてのインスタンスを replaceValue に置き換えます。

例えば、関数 replace(logGroup,"smoke_test","Smoke") はフィールド logGroup に文字列値 smoke_test を含むログイベントを検索し、その値を文字列 Smoke に置き換えます。

strcontains(str: string, searchValue: string)

number

strsearchValue が含まれている場合は 1 を返し、それ以外の場合は 0 を返します。