CloudWatch Logs Insightsとは
CloudWatch Logsのログデータをクエリを使って検索したり解析ができます。
ログデータを解析する機会が多いので、よく使うクエリをまとめておきます。
初期表示
fields @timestamp, @message
| sort @timestamp desc
| limit 20
意味:fieldsで指定した@timestamp, @messageを表示。@timestampの降順でソートして先頭からの20件。
@でログイベントのフィールドを指定します。
ログイベント一覧
@message :InputLogeventのmessageフィールド。
@timestamp : timestamp フィールドに含まれるイベントタイムスタンプ。InputLogeventのtimestampフィールド。
@ingestionTime:CloudWatch Logs によって受信された時間。
@logStream:ログイベントの追加先のログストリームの名前。ログストリームは、生成時と同じプロセスでログをグループ化します。
@log:ロググループ識別子。
コマンド一覧
コマンド | 説明 |
---|---|
display | クエリ結果に表示するフィールドを指定します。 |
fields | 指定したフィールドをログイベントから取得して表示します。 |
filter | クエリの結果を1つ以上の条件に基づいてフィルタリングします。 |
sort | 取得したログイベントをソートします。 |
stats | ログフィールドの値に基づいて集約統計を計算します。 |
limit | クエリから返されるログイベントの数を指定します。 |
parse | ログフィールドからデータを抽出し、1 つ以上のエフェメラルフィールドを作成してクエリでさらに処理できるようにします。 |
fields
ログ一覧に指定した項目を表示する。
fields @timestamp, @message, path
連結もできる。
domain フィールドと path フィールドの値がハイフンで連結してurlとして表示
fields concat(domain, '/', path) as url
filter
クエリの結果を1つ以上の条件に基づいてフィルタリング。さまざまな演算子など使える。
比較演算子 (=、!=、<、<=、>、>=) とブール演算子 (and、or、および not)
in (not in)
fields @timestamp, @message
| filter statusCode in [300,400,500]
| filter statusCode not in [200,0]
like(not like)
fields @timestamp, @message
| filter @message like "一致したい文字"
| filter @message like /正規表現パターンと一致たい文字/
| filter @message like /E*/ #ワイルドカード使用して部分一致
| filter @message not like "Exception"
sort
昇順 (asc) と降順 (desc) で並び順を指定する。
例)f1で降順にソート
fields f1, f2, f3
| sort f1 desc
limit
クエリから返されるログイベントの数を指定。
制限を指定しない場合、クエリにはデフォルトで最大1000行表示される。
例)@timestampで降順にソートして、最初の 25 件のイベントの f1 フィールドと f2 フィールドを表示
sort @timestamp desc
| limit 25
| display f1, f2
stats
ログフィールドの値に基づいて集約統計を計算する。
stats コマンドに「by」 を付けることで、条件を1つ以上指定できる。統計データは、指定の条件でグループ化できる。
stats コマンドでは、sum()、avg()、count()、min()、および max() の演算子が使える。
例)例外が発生したレコードの数をカウント
fields @timestamp, @message
| stats count(*) by errorCode, errorMessage
コメントアウト
クエリ内でのコメントは#を使用する
fields @timestamp, @message
# | filter @message like /delay/
| limit 20
使用例
ステータスが500のログを検索
fields @timestamp, @message
| filter @message like /"status": "500"/
| sort @timestamp desc
ステータスが500のログでpathに特定の文字が入ったログを検索
fields @timestamp, @message
| filter @message like /"status": "500"/
| filter @message like /candidate/
| sort @timestamp desc
ドメイン指定pathに特定の文字が入ったログを検索
fields @timestamp, @message
| filter domain = "api.sample.com"
| filter @message like /userRequest/
| sort @timestamp desc
ステータスが500のログでpathとリクエストに特定の文字が入っているログを検索
fields @timestamp, @message
| filter @message like /"status": "500"/
| filter @message like /chatform/
| filter req like /zipcode/
| sort @timestamp desc
まとめ
Logs Insightsが使えるようになると、問題が発生した時、ただやみくもにログを調べて未解決事件になりかねないことも
簡単に原因が見つかって解決してしまうことがよくあります。
とても便利な機能なので、参考にしていただけると幸いです。