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