TECHNICAL BLOG

2023/7/24 # AWS # 使ってみた 2023/7 CloudWatch Logs Insights超入門

CloudWatch Logsは使っているけど、CloudWatch Logs Insightsは使ったことないなという人向けに、CloudWatch Logs Insightsをご紹介したいと思います。

何が便利?

ログ調査をしたいときに、CloudWatch Logsで検索すると

  • 余計なログまで拾ってしまう
  • 期間指定がうまく動かない
  • 検索に時間がすごくかかる

ということはありませんか?私はありました。

ここでCloudWatch Logs Insightsを使うと、こういった不便な部分が解消されたので紹介していきます。

シンプルな使い方

まずCloudWatch Logsのここから遷移できます。

入口

そして画像のように入力欄にクエリを書いて検索する機能です。

画面説明

そして、一番シンプルな使い方としてはlike検索です。

fields @timestamp, @message
| filter @message like /任意の検索文字/
| sort @timestamp desc
| limit 20

基本的なクエリの意味は、下のようになります。

  • fields: CloudWatch logsで見た時のカラムに相当し、@timestampと@messageを設定していたら間違いないです
  • filter: これで検索条件(文言)を絞れます
  • sort: @timestampでdescにしていたら間違いないです
  • limit: 検索結果数上限指定ですがサンプルによく20とあるので、よく20を指定しています
filter @message like /任意の検索文字/

like検索する上ではこちらのクエリがキモです。@messageカラムにlike検索して絞るという命令になります。
こちらを活用すれば、特定のエラー文言等で絞り込みしやすいのでおすすめです。

また、期間についてはクエリで指定するのではなく、AWSコンソール画面から時間を絞るのでご注意ください。

検索クエリ

ここでは、もう少し自由度があり、私がログ調査をする際に活用している検索クエリをご紹介します。

// エラーだけ抽出
fields @timestamp, @message
| filter log_level = 'error'
| sort @timestamp desc
| limit 20

// キーワード一致
fields @timestamp, @message
| filter log_message = '処理開始'
| sort @timestamp desc
| limit 20

// キーワード一致(1日単位の集計)
filter log_message = '全処理完了'
| stats count(*) by bin(1d)

各コメントから利用シーンや有用さについてはご理解いただけると思いますが、
@マークのないlog_levellog_messageという見慣れないフィールドがあります。

普段CloudWatch Logsにはテキストで文言のみ出力されているかと思いますが、
CloudWatch LogsにJSON形式でログ出力しておくとJSONのkeyで上記ような@マークなし検索ができます。(JSONは改行されていなくても大丈夫です)

{
  "log_level": "error",
  "log_message": "処理失敗",
  "status": "500",
  "time": 250
}

JSONのkey名は自由に決めて良いので、サービスや運用に合わせ設計していくと検索する際に強力な味方となってくれるでしょう。

API Gateway

API Gatewayもログを出すように設定しておくとCloudWatch Logsにログが残るので、簡単ですがいくつか紹介します。

かなり実践的な内容ですが、リリース直後などに様子をみたい時に役立つと思います。

// 応答速度の平均と最大値を求める
stats avg(responseLatency) as AVG,
  max(responseLatency) as MAX
| display AVG, MAX

// 特定パスの平均・最大値・アクセス数を求める
filter resourcePath = '/hoge'
| stats avg(responseLatency) as AVG,
  max(responseLatency) as MAX,
  count(*) as COUNT
| display AVG, MAX, COUNT

// 4xx系エラーの抽出
fields @timestamp, @message
| filter status like /^4.*/
| sort @timestamp desc
| limit 20

このようにcountだけでなく、平均や最大も集計できます。

最後に

ログは開発時には地味な存在です。しかし、長期運用していくと何かとトラブルは発生し、その時ログは問題解決する上で私たちを助けてくれる大事な味方ですので、より良い運用をしていく上で興味を持っていただけたらよかったら幸いです。