Open2

CloudWatch Logs Insights の勉強メモ

daisuzzdaisuzz

CloudWatch Logs Insightsとは

  • CloudWatch Logsのログデータを、クエリを使って検索する機能
  • 専用のクエリ言語とコマンドで構成
  • 作成したクエリは保存することができる
  • CloudWatch Logsに送信されるログは以下のフィールドが自動生成される
    • @message
      • 生の未解析のログイベント
    • @timestamp
      • ログイベントのtimestampに含まれるイベントタイムスタンプ
    • @ingestionTime
      • ログイベントがCloudWatch Logsによって受診された時間
    • @logStream
      • ログイベントの追加先のログストリーム名
    • @log
      • account-id:log-group-name という形式のロググループ識別子
  • 自動生成されるフィールドの先頭に@記号を挿入
  • CloudWatch Logs Insightsが自動検出しないフィールドを持つログタイプについては、parseコマンドを使用してフィールドを抽出, 作成できる
  • フィールド名が@始まりの場合は、さらに先頭に@が付与される
  • ネストしたJSONフィールドをドット表記で表す
    • 例 userIdentity.type
  • JSON配列はフィールド名と値のリストにフラット化される
    • 例 requestParameters.instancesSet.items.0.instanceId
daisuzzdaisuzz

CloudWatch Logs Insightsのクエリ構文

  • 1つ以上のクエリコマンドをUnix形式の|で区切って含めることができる

  • #で始まる行は無視される

  • 6つのクエリコマンド

    • display

      • クエリ結果に表示するフィールドを指定
      • 1つのクエリで複数回displayを指定すると、最後に指定されたフィールドのみが使用される
      • サンプル
        fields @message
          | parse @message "[*] *" as loggingType, loggingMessage
          | filter loggingType = "ERROR"
          | display loggingMessage
        
        • @messageを使用して、loggingType, loggingMessageというエフェメラルフィールドを作成
        • loggingTypeがERRORのもののみをフィルタリング
        • loggingMessageを表示
    • fields

      • 指定したフィールドをログイベントから取得して表示
      • fieldsコマンド内で関数とオペレーションを使って、表示するフィールド値を変更したり、新しいフィールドを作成できる
      • サンプル
        fields `foo-bar`, action, abs(f3-f4)
        
        • foo-barフィールドとactionフィールドとf3-f4の差分の絶対値を表示する
        fields concat(Operation, '-', StatusCode) as opStatus
        
        • OperationフィールドとStatusCodeフィールドを-で連結したものを、エフェメラルフィールドopStatusとして作成して表示
    • filter

      • クエリの結果を1つ以上の条件に基づいてフィルタリング
      • 演算子や式を使用できる
      • サンプル
        fields f1, f2, f3 | filter (duration>2000)
        
        • durationフィールドの値が2000を超えるログイベントについてf1, f2, f3フィールドを取得する
        fields f1, f2 | filter (f1=10 or f3>25)
        
        • f1=10もしくはf3>25の全てのログイベントについてf1フィールドとf2フォールドを取得する
        fields f1 | filter statusCode like /2\d\d/
        
        • statusCodeが200 ~ 299のログイベントを返す
        fields @timestamp, @message | filter statusCode in [300, 400, 500]
        
        • statusCodeが300,400,500のログイベントを返す
        fields @timestamp, @mesasge | filter Type not in ["foo", "bar", 1]
        
        • 値がfoo, bar, 1のTypeフィールドを持たないログイベントを返す
    • stats

      • ログフィールドの値に基づいて集約統計を計算する
      • statsとbyを使うことで統計計算時に利用するデータをグループ化するための条件を指定できる
      • 統計演算子の例
        • avg()
        • sum()
        • count()
        • min()
        • max()
      • サンプル
        stats avg (f1) by f2
        
        • f2の一意の値ごとにf1の平均値を計算
    • sort

      • 取得したログイベントをソートする
      • 昇順と降順をサポート
      • サンプル
        fields f1, f2, f3 | sort f1 desc
        
        • f1の値に基づいて降順にソートしてf1, f2, f3を表示
    • limit

      • クエリから返されるログイベントの数を指定
      • limitをつかうことで、コンソールに表示されるクエリ結果をデフォルトの1000よりも多く表示することができる
      • サンプル
        sort @timestamp desc | limit 25 | display f1, f2
        
        • @timestampの値に基づいてログイベントを降順にソート
        • 先頭から25件のf1, f2フィールドを返す
    • parse

      • ログフィールドからデータを抽出して1つ以上のエフェメラルフィールドを作成してクエリで処理できるようにする
      • glob表現と正規表現の両方をサポート
        • glob表現
          • 変数を*で表現
          • *で置き換えたテキストをas以降で指定したエフェメラルフィールドの値として抽出される
        • 正規表現
          • /で囲む
          • 抽出される文字列が名前付きキャプチャグループで囲まれる
          • 名前付きキャプチャグループとは、(?<name>.*)のよう名形式
            • nameがエフェメラルフィールドの名前
            • .*がパターン
      • サンプル
        # glob表現
        parse @message "[*] * The error was: *" as level, config, exception
        
        # 正規表現
        parse @message /\[(?<level>\S+)\]\s+(?<config>\{.*\})\s+The error was: (?<exception>\S+)/
        
        • エフェメラルフィールドlevel, config, exceptionを作成する
  • ログフィールドに@ . 英数字以外の文字が含まれる場合はバッククオートで囲む必要がある

  • filterで使える表現

    • 比較演算子
      • =, !=, <, <=, >, >=
    • ブール演算子
      • and, or, not
    • 正規表現
      • //で囲む
    • in (not in)
      • 完全一致
    • like (=~)
      • "か'で囲む
  • as

    • クエリにエイリアスを設定する
    • fields, stats, sortコマンドで使える
  • 参考