CloudWatch Logs Insightsのクエリ構文を使って、ログを検索する
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の料金
アジアパシフィック (東京) リージョンでは
分析 (Logs Insights のクエリ) スキャンしたデータ 1 GB あたり 0.0076USD
簡単に1USD=100円 とすると、0.76円 / 1GB かかる。
スキャンしたデータに料金がかかるので、検索する期間を絞ることが重要。
Discussion