💬

CloudWatch Logs Insightsのクエリ構文を使って、ログを検索する

2023/07/28に公開

CloudWatch Logs Insights とは

CloudWatch Logsのログを検索するのに、クエリ構文をつかって高速にログを取得できます。(イメージとしては、mysqlでテーブルをSQLで検索する感じです。)

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

このようなクエリ構文をつかって、cloudWathLogsのログを検索することができます。
以下、SQLと比較しながら説明していきます。

クエリ構文のコマンドの説明

クエリ構文を構成するコマンドは以下のものがあります。

コマンド 説明 SQLだと
fields ログから指定したフィールドを取得 index
filter 比較演算子、正規表現をつかって、ログを検索 where
sort 検索結果のログをソートする sort
limit 検索結果のログの件数を指定 limit
display ログの検索結果の表示を制御 select
stats 集約、統計計算、グループ化など group by
parse 正規表現で一時的な項目(エフェメラルフィールド)を作成する

今回はログの検索がテーマなので、stats、parseの説明はしません。
また別の機会に詳しくまとめたいと思います。

fields

SQLだとindexに近いと思ってます。

あえて指定するメリットとしては、

データ量の削減
パフォーマンスの向上
クエリの可読性

があります。

filter

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

SQLだとwhere句です。

filter (range>3000 and accountId=123456789012)

演算子を用いて検索する

filter @message like /error/

like演算子は、正規表現を使用して文字列の一致を検索する

filter (range>3000 and accountId=123456789012)
| filter @message like /error/

複数指定すると、AND条件になります。

sort

SQLだとorder by句です。

sort @timestamp desc

asc(昇順)、 desc(降順)が指定できます

limit

SQLだとlimit句です。

limit 20

検索結果の最大件数を指定します。

display

SQLだとselect句になります。

display @timestamp, @message

ログを取得してみる

特定の文字列を含むログ

fields @timestamp, @message, @logStream, @log
| filter @message like "ERROR"
| filter @message like "user_id=12345"
| sort @timestamp asc
| limit 20
| display @timestamp, @message

user_id=12345で発生している、エラーを検索する

さらに時間で絞り込む

fields @timestamp, @message, @logStream, @log
| filter @message like "ERROR"
| filter @message like "1821207"
| filter @timestamp > 1687173840000 and @timestamp <= 1687173900000 
| sort @timestamp asc
| limit 20
| display @timestamp, @message

user_id=12345で発生している、エラーを検索する。
さらに、2023-06-19 20:24:00.000 - 2023-06-19 20:25:00.000の間で検索する。

(Tips)検索する日付の期間について

Logs Insightsではロググループと検索する日付の期間はコンソール画面であらかじめ指定します。
なので、SQLみたいにwhere句で日付で絞り込む必要はありません。

(Tips)クエリ構文のコマンドの順番について

コマンドの順番は動作やパフォーマンスに影響がないが、以下の順番が一般的です。

fields
| filter
| parse
| stats
| sort
| limit
| display

(Tips)CloudWatch Logs Insightsの料金

料金 - Amazon CloudWatch | AWS

アジアパシフィック (東京) リージョンでは

分析 (Logs Insights のクエリ) スキャンしたデータ 1 GB あたり 0.0076USD

簡単に1USD=100円 とすると、0.76円 / 1GB かかる。
スキャンしたデータに料金がかかるので、検索する期間を絞ることが重要。

Discussion