[アップデート]Amazon CloudWatch Logs は、フィルターパターンに正規表現が扱えるようになりました

2023.09.07

はじめに

Amazon CloudWatch Logsのフィルターパターン構文が正規表現をサポートするようになりました。

CloudWatch Logsでは、フィルターパターン構文を使ってログを検索したり、メトリクスフィルターを用いてメトリクスを抽出したり、サブスクリプションフィルターを利用して特定のログを他の宛先(Lambdaなど)へ送信することができます

今回のアップデートにより、フィルターパターン構文に正規表現を用いて、関連するログの検索とマッチングがより簡単になります。

サポートされている正規表現は、以下の通りです

  • 英数字
    • 文字 (A ~ Z または a ~ z) または数字 (0 ~ 9) のいずれかの文字です
  • 記号文字
    • _#=@/;,-
    • !などは利用できません
  • 演算子
    • ^$?[]{}|\*+.、`
    • ()などは利用できません

また、正規表現を利用する場合、式に対して%で囲む必要があります。

サポートされている正規表現の演算子は、下記ドキュメントに、1つ1つ分かりやすく解説されていますので、一読ください。

やってみた

ログストリームのログの検索やサブスクリプションフィルターで、正規表現を利用してみます。

特定のステータスコード

ステータスコードが4xxのJSONログイベントだけを取得したい場合、以下のような正規表現を使用します。(他にも方法はあり得ます)

{ $.statusCode=%4[0-9]{2}% }

先程もお伝えしたように、正規表現を利用する場合、対象を%で囲む必要があります。

{2}は、前の用語を2回以上利用する値に一致します。

マッチする内容は、ステータスコードが403や401です。

{ "statusCode": "403" }
{ "statusCode": "400" }

サブスクリプションフィルターでも同様の結果でした。

マッチしない内容は、4xx以外の内容です。

{ "statusCode": "503" }
{ "statusCode": "300" }

ログレベル

特定のログレベル(DEBUG、ERROR、WARN)のJSONログイベントをチェックしたい場合は、以下の正規表現を使用します。

{ $.loglevel = %DEBUG|ERROR|WARN% }

OR表現は、|を使います

マッチする内容は、ログレベルがDEBUG, ERROR, WARNのみです。

{ "loglevel": "ERROR" }
{ "loglevel": "DEBUG" }

マッチしない内容は、異なるログレベルや小文字の場合です

{ "statusCode": "INFORMATION" }
{ "statusCode": "error" }

URL

非構造化ログイベントの中で、特定ドメイン(test.com)を含むログをフィルタリングしたい場合、以下の正規表現を使用します。

%test\.com*%

.は、サポートされている演算子であり、「任意の1文字と一致する」という内容のため、\でエスケープさせます。

マッチする内容は、ログにtest.comが記載されている場合のみです。

https://test.com/hoge
https://sub.test.com/hoge

マッチしない内容は、ログにtest.comの記載がない場合です。

https://sub.hoge.com/hoge

特定の日付

非構造化ログイベントの中で、特定の日付範囲(YYYY-MM-DD形式)を確認したい場合、以下の正規表現を使用します。

%2023-\d{2}-\d{2}%

\dは、数字の値と一致します。

マッチする内容は、YYYY-MM-DD形式の2023年の日付です。

2023-10-04
2023-03-21

マッチしない内容は、YYYY-MM-DD形式ではない場合や、2023年でない場合です。

2024-10-04
2023-10-4

除外キーワード

一般的に除外したいキーワードを正規表現で表す場合、^(?!.*apple)いった表現をします。

CloudWatch Logsの正規表現構文に、()サポートされていませんので、エラーとなります。

そのため、appleを除外キーワードとしたい場合、正規表現では対応できないため、従来通り- appleを使用するとよさそうです。

もしできる方法があれば教えてください。。

最後に

今回は、Amazon CloudWatch Logsのフィルター機能が正規表現をサポートしたことを紹介しました。

従来、複数のフィルタを定義していたケースがありますが、正規表現がサポートされることで、フィルタを1つ定義できるようになることもありますので、より検索がしやすくなります。

ただし、全ての正規表現をサポートしているわけではないことに注意が必要です(例えば、()です)。

参考