CloudWatch Logs とは
CloudWatch Logs は、EC2 インスタンスや Lambda function などのログを管理し、検索できる便利なサービスです。今回は、特定のログ情報をフィルタする方法について紹介します。
CloudWatch Logsでフィルターパターンで正規表現を用いることができるのですが、苦戦したので参考にしていただけば幸いです。
前提条件
- 対象とするLog groupが存在する
1.フィルタの作成
CloudWatch Logs のコンソールにログインします。
左側のナビゲーションペインで、[Log groups] を選択します。
対象とする log group を選択し、「フィルタイベント」をクリックします。
2. フィルタパターンの作り方
フィルタパターンを作成する際には、「応答時間が1秒以上かかったリクエスト」や「エラーメッセージ」などの特定の条件を抽出することができます。
パターンは、 { $.duration > 1.00 } や { $.errorMessage != null} のように JSONのようのな フィルタパターンを指定します。
Oracleのログの中にOracleのエラーコードを検知したい場合について例です。
正規表現の使用例:
1.a!="*ORA-1234"
「ORA-1234」で終わる文字列を除外(*はワイルドカード、)
この正規表現でora-1234以外のoracleエラーログを検知することができます。
もう少し複雑なことをしたい方向けに正規表現を用いたフィルターを作成します。
もう少し複雑な条件を設定したい場合は、正規表現を用いることが可能です。例えば、「Oracleエラーログを検知したいが、特定の文字列が含まれている場合は検知したくない」という場合です。
正規表現の使用例:
1.a!="*ORA-1234"&&a!="*OK*"
このフィルタは、「ORA-1234」と「OK」を含まないログを抽出します。
正規表現の使用例:
1. a=%ORA-1234% - 「ORA-0」を含む文字列を検索
2. a=%ORA-1234$% - 「ORA-0」で終わる文字列を検索
3. a!=%ORA\-1234\D% - 「ORA-0の後に数字以外の文字」が含まれる文字列を除外
%の役割について
フィルターパターンで使用される%は、部分一致検索を行うためのワイルドカードのような役割を持ちます。これにより、指定した文字列を含むログを抽出することが可能です。
1. %文字列% - 「文字列」を含むすべてのログにヒットします。
2. %文字列$ - 「文字列」で終わるログにヒットします。
3. ^文字列% - 「文字列」で始まるログにヒットします。
ただし、(ワイルドカード)と%を組み合わせる場合には注意が必要です。例えば、%ORA-1234%は構文エラーとなるため、次のようにダブルクォーテーションで囲む必要があります。
1. "*%ORA-1234%"
3. フィルタのテスト
テストメッセージを入力し、「テストパターン」ボタンをクリックしてみましょう。結果が期待通りにフィルタされれば、設定は完了です。
4. まとめ
今回は CloudWatch Logs で特定のログを検出する方法について解説しました。この方法を使えば、大量のログから特定の情報を素早く見つけることが可能となります。ログ分析がさらに効率的になり、問題解決に役立つこと思います。
備忘(自分用メモ) 正規表現パターン試した結果とか残しておきます。
参考までにどうぞ。
検索方法は、部分一致での検索となる(定義する語句を含むログイベントのみを返します。)
例)「%ORA-1234%」で"ORA-1234を含む"文字列にヒットする
「%^ORA-1234%」で"ORA-1234から始まる"文字列にヒットする
「%ORA-1234$%」で"ORA-1234で終わる"文字列にヒットするa=に続く文字が
%以外で始まる「a=ORA-1234」
文字列は意味を持たない文字として扱われる
・但し、*はワイルドカードとして扱われる
→の後ろに%を記載すると構文エラーとなる。(メトリクスフィルターの仕様)
(の後ろに%を記述したい場合はダブルクォーテーションで全体を囲む)
例)「%ORA-1234%」は構文エラー
「"%ORA-1234%"」は「%ORA-1234%」で終わる文字列にヒットする
・検索方法は完全一致での検索となる
例)「"ORA-1234*"」は「ORA-1234で始まる」文字列にヒットする
「"*ORA-1234"」は「ORA-1234で終わる」文字列にヒットする
「"ORA-1234"」は「ORA-1234を含む」文字列にヒットする
「"ORA-1234"」は「ORA-1234に完全一致する」文字列にヒットする
a="*ORA-*" 「ORA-」を含む文字列をキャッチ(*はワイルドカード)
a!="*Patch Description*" 「Patch Description」を含む文字列を除外(*はワイルドカード)
a!=%ORA\-1234\D% 「"ORA-1234"の後に数字以外の1文字」を含む文字列を除外(\Dは数字以外の1文字を表す正規表現のメタ文字)
a!="*ORA-1234" 「ORA-0」で終わる文字列を除外(*はワイルドカード)
a!=%ORA\-1234\D% 「"ORA-00000"の後に数字以外の1文字」を含む文字列を除外(\Dは数字以外の1文字を表す正規表現のメタ文字)
a!="*ORA-1234" 「ORA-00000」で終わる文字列を除外(*はワイルドカード)