Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

待望の正規表現の否定パターンに対応した fluent-plugin-rewrite-tag-filter v1.3.0 をリリースしました #fluentd

ログ収集ツールFluentdに、Apachemod_rewriteのようにtagを自在に書き換える機能を追加する、fluent-plugin-rewrite-tag-filterのv1.3.0をリリースしました。

今回の目玉である新機能は、rewriteruleにおける正規表現の否定パターンへの対応です。
これは、正規表現該当する 場合のみタグの書き換えだけでなく、
正規表現該当しない 場合のタグ書き換えも出来るようになりました。

変更内容概要

修正履歴より紹介します。

  • [新機能] rewriteruleにて否定演算子が使えるようになりました
  • [不具合] 書き換え対象のキーが存在しないレコードを処理する際に不要となる処理をスキップするようにしました
  • [改修] rewriteruleの1つ目が、rewriterule1でなくとも動作するようになりました
  • [改修] rewriteruleの設定上限数200個(rewriterule1~rewriterule200)の制限を撤廃しました
  • [改修] rewriteruleの添え字に連番数字でない欠番があっても動くようになりました
    つまり、rewriterule10始まりで、次がrewriterule20でも動きます
  • [改修] 設定ファイルの記述エラーを見つけた際のエラーメッセージを分かりやすくしました

新機能の他は主にリファクタリングによる成果で、従来の制約を各種撤廃しました。
その結果、下位互換性は保ちつつ、設定ファイルがより自由に書けるようになります。

新機能「正規表現の否定パターン対応」の解説

これはmod_rewrite同様に正規表現の前に ! (exclamation mark)を使い、否定パターンを定義することが出来る新機能です。それでは「UserAgentがInternet explorerを示すMSIEで無かった場合」という条件分岐を例にして説明します。

mod_rewriteであれば、このように書けます。

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !MSIE
RewriteRule ^.*$ http://example.com [R=301,L,NS]

rewrite-tag-filterなら、このように書けます。

<match apache.access>
  type rewrite_tag_filter
  rewriterule1 agent !MSIE not_msie
</match>

否定パターンに対応したことで、不要なデータを取り除いた後に対象を絞ってタグの書き換えが出来るようになりました。
応用編として、HTTPアクセスログであればUserAgentが特定パターン以外のものを除外し、その後にタグ書き換えを行うことも出来ます。

# UserAgentがMSIEではなく、HTTPステータスコードが200ではない物を対象に、  
# URLの第1階層を後方参照とし、書き換え後のタグに代入するというサンプル
<match apache.access>
  type rewrite_tag_filter
  rewriterule1 agent !MSIE clear
  rewriterule2 status !200 clear
  rewriterule3 path ^/([^/]+?)/ site.$1
</match>

<match clear>
  type null
</match>

謝辞

正規表現の否定パターン対応は、 m.yuzuki (@ephemeralsnow)さんによる提案です。
ありがとうございます。

最後に

初期リリースである2012年6月から改善を重ねること1年以上が経ち、バージョン1.3.0にまで進んで参りました。 まだまだ改良を続けて行きたいと思っていますので、皆さんの「こんな事をしたい!」という声をお待ちしています。