🤣

Lambdaのログを目視で探しているのは多分自分だけ

2025/01/25に公開

TL;DR

  • CloudWatch Logs Insightsを使えばログの検索ができる
  • 構造化ログを出力したらフィールド検索ができる
  • 例)levelERRORのログを検索する
fields @timestamp, message
| filter level = "ERROR"
| sort @timestamp desc

きっかけ

「昨日からLambdaでエラーが発生しているっぽいから調査してほしい」

こういう依頼が来たので、自分は対象のログを探すことにしました。
CloudWatchのログから 1つ1つ目視で せっせと探しました。

そんな自分を見てメンバーが言いました。

・・・

CloudWatch Logs Insightsとは?

  • CloudWatchのログを効率的に検索できるサービス
    • 例)メッセージ「ERROR」を含むログを検索
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 50
  • JSON形式で出力されたログの各フィールドに対して、直接検索が可能
    • 例)levelERROR のログを検索
fields @timestamp, message
| filter level = "ERROR"
| sort @timestamp desc

実際に使ってみる

以下のLambda関数を作成して実際にログの検索を行ってみます。
ランタイムは Node.js です。

TestFunction
export const handler = async (event, context) => {
  // 現在のタイムスタンプを取得
  const timestamp = new Date().toISOString();
  
  // ログ出力(INFOレベル)
  console.log(JSON.stringify({
      level: 'INFO',
      timestamp: timestamp,
      functionName: context.functionName,
      requestId: context.awsRequestId,
      message: 'Lambda function invoked successfully',
  }));

  try {
      if (!event || !event.key) {
          throw new Error("Invalid input: 'key' is missing");
      }

      // ログ出力(INFOレベル)
      console.log(JSON.stringify({
          level: 'INFO',
          timestamp: timestamp,
          functionName: context.functionName,
          requestId: context.awsRequestId,
          message: 'Processing completed successfully'
      }));

      return {
          statusCode: 200,
          body: JSON.stringify({ message: 'Success', input: event })
      };
  } catch (error) {
      // ログ出力(ERRORレベル)
      console.error(JSON.stringify({
          level: 'ERROR',
          timestamp: timestamp,
          functionName: context.functionName,
          requestId: context.awsRequestId,
          errorMessage: error.message,
          stackTrace: error.stack
      }));

      return {
          statusCode: 500,
          body: JSON.stringify({ message: 'Error processing request', error: error.message })
      };
  }
};

Lambda関数を起動しログを生成します。

ここから Logs Insights を利用してログレベルが ERROR のログを検索してみます。

使用するクエリ文

fields @timestamp, message
| filter level = "ERROR"
| sort @timestamp desc

CloudWatchダッシュボードから

クエリの実行をすると、確かにログレベルが ERROR のログを抽出できています。

やったね!

まとめ

  • CloudWatch Logs Insightsを使うとログの検索ができる
  • 構造化ログ形式で出力すると、フィールドに対して検索ができる
  • CloudWatch Logs Insightsは検索対象のデータ量に対して課金が発生する

というわけでCloudWatchのログを1つ1つ確認して時間を無駄にした話でした。

Discussion