Programming Self-Study Notebook

勉強したことを忘れないように! 思い出せるように!!

CloudWatch Logs Insightsでログを絞りこむ

f:id:overworker:20210304234231p:plain:h200

CloudWatch logs Insights(インサイト)のクエリの使い方について調べました。

f:id:overworker:20210503164249p:plain

参考文献

基本的なコマンドの概要

コマンド 説明
display クエリ結果に表示するフィールドを指定します。
fields 指定したフィールドをログイベントから取得して表示します。
filter クエリの結果を 1 つ以上の条件に基づいてフィルタリングします。
sort 取得したログイベントをソートします。
stats ログフィールドの値に基づいて集約統計を計算します。
limit クエリから返されるログイベントの数を指定します。
parse ログフィールドからデータを抽出し、1 つ以上のエフェメラルフィールドを作成してクエリでさらに処理できるようにします。

コマンドの詳細(私がよく使う順)

fields

説明

  • 指定したフィールドをログイベントから取得して表示します。
  • fields コマンド内で関数とオペレーションを使用して、表示するフィールド値を変更したり、クエリの残りの部分で使用する新しいフィールドを作成したりできます。

# 基本的な記述
fields @timestamp, @message

# `message`の中の`mesthod`と`path`を`-`でつなぎ、新たに`api`と命名する
fields @timestamp, concat(message.method, '-', message.path) as api

sort

説明

  • 取得したログイベントをソートします。
  • 昇順 (asc) と降順 (desc) の両方がサポートされています。

# 基本的な記述(デフォルトは昇順)
fields @timestamp, @message
| sort @timestamp

# 降順を指定
fields @timestamp, @message
| sort @timestamp desc

limit

説明

  • クエリから返されるログイベントの数を指定します。
  • これを使用して、結果を小さい数値に制限し、関連する結果の小さいセットを表示することができます。
  • さらに、limit で 1000 ~ 10,000 の数値を使用し、コンソールに表示されるクエリ結果の行数を、デフォルトの 1000 行より大きい数に増やすこともできます。
  • 制限を指定しない場合、クエリにはデフォルトで最大 1000 行表示されます。

# 最新の25件を表示する
fields @timestamp, @message
| sort @timestamp desc
| limit 25

filter

説明

  • クエリの結果を 1 つ以上の条件に基づいてフィルタリングします。
  • filter コマンドでは、さまざまな演算子や式を使用できます。
使用できる演算子・表現
  • 正規表現
  • 比較演算子 (=!=<<=>>=)
  • ブール演算子 (andornot)
  • 文字列一致
    • 完全一致:in (not in)
    • 部分文字列:lile(または、=~

# `message.duration`が`2000`より大きいもの、かつ`message.method`が`POST`
fields @timestamp, @message
| sort @timestamp desc
| limit 25
| filter (message.duration > 2000) and (message.method = 'POST')

# message.durationが2000より大きいもの
fields @timestamp, @message
| sort @timestamp desc
| limit 25
| filter @message like /("status":"5\d{2}")/

# statusCodeが配列要素のいずれかと完全一致する
fields @timestamp, @message
| sort @timestamp desc
| limit 25
| filter statusCode in [300,400,500]

stats

説明

  • ログフィールドの値に基づいて集約統計を計算します。
  • statsby を併用すると、統計の計算時にデータをグループ化するための 1 つ以上の条件を指定できます。
  • 統計演算子として、avg()sum()count()min()max() などがサポートされています。

# f2 の一意の値ごとに f1 の平均値を計算します。
stats avg (f1) by f2

display

説明

  • クエリ結果に表示するフィールドを指定します。
  • このコマンドをクエリで複数回指定すると、最後に指定したフィールドのみが使用されます。

# timestampのみを表示する
display @timestamp

parse

説明

  • ログフィールドからデータを抽出し、1 つ以上のエフェメラルフィールドを作成してクエリでさらに処理できるようにする。
  • parse は、glob 表現と正規表現のいずれも承認します。

その他

クエリのコメントアウト

  • # 文字を使用して、クエリの行をコメントアウトすることができます。
  • # 文字で始まる行は無視されます。

演算子・関数

  • 比較演算子 (=!=<<=>>=)
  • ブール演算子 (andornot)
  • 算術演算子(+(加算),-(減算),*(乗算),/(除算),^(指数),%(剰余))
  • 数値処理(abs(絶対値),ceil(上限に切り上げられる),floor(下限に切り下げられる),greatest(最大値を返す),least(最小値を返す),log(自然対数),sqrt(平方根))
  • 一般関数:省略
  • 文字列関数:省略
  • 日時関数:省略
  • IPアドレス関数:省略
  • 統計集計関数:一部

    関数 説明
    count() ログイベントをカウントする
    count(fieldName: LogField) 指定されたフィールド名を含むすべてのレコードをカウントする
    sum(fieldName: LogField) 指定したフィールドの値の合計
    pct(fieldName: LogFieldValue, percent: number) 指定されたフィールドの値の標準偏差
    stddev(fieldName: NumericLogField) 指定したフィールドの値の合計