Open4

CloudWatch Logs Insights のクエリ構文についてメモ

あーあー

そもそもCloudWatch Logs Insightsとは?

CloudWatch Logsのログデータをクエリ言語を利用して簡単に検索したり分析ができるサービス

CloudWatch Logs Insights では、クエリ言語を使用してロググループに対するクエリの実行します。クエリ構文は、一般的な関数、算術演算と比較演算、正規表現など、さまざまな関数とオペレーションをサポートしています。複数のコマンドを含むクエリを作成します。コマンドはパイプ文字 (|) で区切ります。コメントを含むクエリを作成します。ハッシュ文字 (#) を使用してコメントを開始します。

あーあー

CloudWatch Logs Insights クエリコマンド

display

display を使用して、クエリ結果の特定のフィールドを表示します。

fields

fields を使用して、クエリ結果の特定のフィールドを表示します。

filter

filter を使用して、1 つ以上の条件に一致するログイベントを取得します。
個人的にはこれはよく使っています(これぐらいしか使えていない)

こんな感じで指定可能 (range の値が 3000 より大きいすべてのログイベントを返すクエリの例)

fields @timestamp, @message
| filter (range>3000)
| sort @timestamp desc
| limit 20 

複数の条件を組み合わせる際はandorが利用できる

フィルターコマンドで正規表現を使う

  • キーワードin
    • in の後に対象の配列を配置することで、集合要素関係をテストできる。
    • in を使用するクエリを作成して、フィールドに文字列の一致があるログイベントを返すことができます。
    • フィールドは完全な文字列である必要がある。
    # 例
    fields @timestamp, @message
    | filter logGroup in ["example_group"]
    
  • キーワードlike(not like)
    • 部分文字列を一致させることができます。
    • 部分文字列を正規表現の演算子と一致させるには、一致させたい部分文字列をスラッシュで囲みます。
    # 例  部分文字列を like と一致させる
    fields f1, f2, f3 
    | filter f1 like "Exception"
    
    # 例 部分文字列を正規表現と一致させる
    fields f1, f2, f3 
    | filter f1 like /Exception/
    

where f1 like '%Exception%'のイメージ

# ピリオド記号(.)を正規表現のワイルドカードとして使用可能
# 例は f1 の値が文字列 ServiceLog で始まる一致を返す
fields f1, f2, f3
| filter f1 like /ServiceLog./
# 大文字と小文字を区別しないパターンで部分文字列を一致させる
# 例は、f1 に単語 Exception または exception が含まれるログベントを返す
fields f1, f2, f3 
| filter f1 like /(?i)Exception/ 

こんな感じで使えそう
@messageに文字列「error」(大文字と小文字を区別しない)が含まれるログを、タイムスタンプの順に20件取得する

fields @timestamp, @message
| filter @message like /(?i)error/
| sort @timestamp desc
| limit 20

stats (todo)

stats を使用して、ログフィールド値で集約統計を計算します。

関数はavg()sum()count()、,min()max()などがサポートされています。
またstatsとbyを使うことでSQLのGroup byのように値を集約することもできます。

filter @message
| stats count(f1) by f1

sort

sort を使用して、ログイベントを昇順 (asc) または降順 (desc) で表示します。

limit

limit を使用して、クエリで返すログイベントの数を指定します。

parse (todo)

parse を使用して、ログフィールドからデータを抽出し、クエリで処理できるエフェメラルフィールドを作成します。
ネストされた JSON フィールドは正規表現で解析できます。

あーあー

Log Fields

次の5つのログフィールドはAmazon CloudWatch Logs に送信されるすべてのログにおいて自動的に生成されます。

  • @message ⋯ 生の未解析ログイベント。ログのメッセージ本文
  • @timestamp ⋯ ログのタイムスタンプ
  • @ingestionTime ⋯ログイベントが CloudWatch Logs によって受信された時間
  • @logStream ⋯ ログストリームの名前
  • @log ⋯ロググループ識別子

参考:
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html