New RelicのLog parsingに関して、多くの場合は、すでに用意されたパターンを利用し記述していただくことができます。また、定義済みのパターン以外のデータを抽出する場合、正規表現を利用して抽出することができるので、そちらをご紹介します。

正規表現を使ったパターンの定義

正規表現を利用する場合、以下のような記載方法で記載することが可能です。

(?<属性名>正規表現でのパターン) 

Logに含まれるテキストの中からメールアドレスを抽出したい場合、利用可能なパターンに定義はなく、自身でパターンを定義する必要があります。そういうケースを例に実現方法を紹介します。

なお、メールアドレスの正規表現を正確に表現することは非常に複雑となりますので、本ブログでは簡易的にGmailで利用可能なパターンを例に作成していきます。Gmailではユーザ名として、英字(a~z)、数字(0~9)、ピリオド(.)が利用でき、またエイリアス機能としてプラス記号(+)が利用できます。これに対応するユーザ名部分(ローカル部)の正規表現を簡単に書くと、「[a-z0-9.+]+」になります。また、ドメイン部分では基本的に英字(a~z)、数字(0~9)、ハイフン(-)が利用でき、ピリオド(.)で区切られれいるため、「[a-z0-9\-]+(\.[a-z0-9\-]+){1,}」にて表現できます。それらを@で繋げた場合、以下のような正規表現になります。

 

[a-z0-9.+]+@[a-z0-9\-]+(\.[a-z0-9\-]+){1,}

メールアドレスの正規表現が上記で定義できました。続いて実際のログに適用していきます。例えば、以下のような時刻、メールアドレス、結果の文字列が含まれるログが出力されていると仮定します。

2023-08-07T03:12:40+09:00 who@newrelic.com success

この場合、前述の正規表現を利用して、以下のようなパータンを設定していただくことができます。

%{TIMESTAMP_ISO8601:timestamp} (?<email>[a-z0-9.+]+@[a-z0-9\-]+(\.[a-z0-9\-]+){1,}) %{WORD:result}

実際にLogsの画面で確認していただくと、わかりますが、正規表現の定義ができてしまえば、非常に簡単にできることがわかります。

正規表現と定義済みパターンの組み合わせ

続いて、定義済みパターンを組み合わせて使う方法についても紹介します。前述のメールアドレスのパターンのうち、ドメイン部分に関しては、定義済みパターンのHOSTNAMEを使うこともできます。具体的には、メールアドレスの正規表現の部分を以下のように変更してみてください。

(?<email>[a-z0-9.+]+@%{HOSTNAME})

すると、以下の画像のように同様の結果を得られることがわかります。

まとめ

今回は正規表現を使って任意のパターンをお客様にて定義していただく方法を紹介いたしました。任意のパターンを定義していただくことで、より柔軟に解析を行っていたいただくことができるようになったと思います。これらをご活用いただき、データを構造化していただくことで、皆様の分析に役立てていただければ幸いでございます。

なお、メールアドレスの正規表現に関しては、完璧を求めると対応が難しいかと思います。そのため、皆様のサービスにて許可されているパターンをベースに適切なパターンを作成していただくことでご対応いただけるかと思います。

おまけ:複数属性への保存

また、メールアドレスそのものも1つの属性へ保存し、その中に含まれるドメイン部分も別の属性へ保存したいというケースもあります。その場合、以下のように記載していただくことで対応することもできるようです。

正規表現のみで記載した場合

以下のように、(?<属性名>正規表現でのパターン) での記載をネストすることで対応できるようです。

 

(?<email>[a-z0-9.+]+@(?<domain>[a-z0-9\-]+(\.[a-z0-9\-]+){1,}))

定義済みパターンと組み合わせた場合

また、定義済みパターンと組み合わせる場合は、以下のように通常の定義済みパターンのみを利用するパターン同様に属性名を設定することで対応できるようです。

(?<email>[a-z0-9.+]+@%{HOSTNAME:domain})

なお、Log parsingには、実行時間の制限があります。そのため、長期的にはLogの出力方法を変更し、Parsingによる対応を減らしていただくことを検討していただくのが良いかと思われます。