2015年01月07日
MT Studioでアクセスログを保存するプラグインを作る
明けましておめでとうございます。本年もPowerCMS、アルファサードの製品・サービスをどうぞ宜しくお願いいたします。
MT StudioではPerlやPHPを記述することなくMTのプラグインが管理画面から作成できることを先日のエントリーでご紹介しました。
- Movable Type 開発者向けツール MT Studio の提供を開始します | PowerCMS ブログ
- MT Studio が提供するテンプレート・タグについて | PowerCMS ブログ
今回もMTMLだけでプラグインを作成する例をもう一つ紹介します。モディファイアでアーカイブテンプレートとテンプレート※の間で値を受け渡したり、モディファイアの値で処理を分岐することができます。これを活用することにより、より汎用的なプラグインが作れます。
※ここでは、アーカイブテンプレートをMTの通常のテンプレート、テンプレートをMT Studioのカスタムハンドラに記述するMTMLテンプレートと区別します。
アクセスログを保存する「MTAccessLog」ファンクションタグ(コマンドタグ)を作る
MTMLでのプラグイン作成の方法は、前々回のエントリをご覧ください。
ページにアクセスするたびに以下のようなアクセスログをログファイルに保存するようにします。再構築時点で評価されても管理画面へのアクセス情報になってしまいますから、このテンプレートタグはダイナミックパブリッシングまたはDynamicMTMLで利用します。
192.168.1.1 GET Mon, 05 Jan 2015 16:17:48 +0900 http://example.com/access.html http://example.com/reffer.html Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/7.1.2 Safari/537.85.11
ログを組み立てる
<MTAccessLog>タグをアーカイブテンプレートに埋め込んでダイナミックパブリッシングまたはDynamicMTMLでアクセスログを作成します。今回もMTMLで作成、ノンコーディングです。
MTSetvarBlockタグのappendモディファイアを活用するとコードを見やすくできます。もしくは、各行に処理を書いておいて regex_replaceモディファイアで改行を削除する方法でも構いません。
<MTSetvarBlock name="log" append="1"><MTGetEnv name="REMOTE_ADDR"> </MTSetvarBlock>
<MTIgnore>サーバー環境変数から接続元アドレスを取得</MTIgnore>
<MTSetvarBlock name="log" append="1"><MTRequestMethod> </MTSetvarBlock>
<MTIgnore>サーバー環境変数からHTTPリクエストメソッドを取得して追加</MTIgnore>
<MTSetvarBlock name="log" append="1"><MTCanonicalURL> </MTSetvarBlock>
<MTIgnore>MTCanonicalURLタグの出力結果を追加</MTIgnore>
<MTSetvarBlock name="log" append="1"><MTDate format_name="rfc822"> </MTSetvarBlock>
<MTIgnore>タイムスタンプを追加</MTIgnore>
<MTSetvarBlock name="log" append="1"><MTGetEnv name="HTTP_REFERER"> </MTSetvarBlock>
<MTIgnore>サーバー環境変数からリファラを取得して追加</MTIgnore>
<MTSetvarBlock name="log" append="1"><MTGetEnv name="HTTP_USER_AGENT"></MTSetvarBlock>
<MTIgnore>サーバー環境変数からUser-Agent情報を取得して追加</MTIgnore>
<MTGetVar name="log" escape="html">
=> 192.168.1.1 GET Mon, 05 Jan 2015 16:17:48 +0900 http://example.com/access.html http://example.com/reffer.html Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/7.1.2 Safari/537.85.11
アクセスログをファイルに追記モードで書き込みする
ファイルにログを書き込むには、先のエントリでご紹介したMT Studio (StudioPlayer)のテンプレートタグ「MTWriteToFile」を使います。
MTWriteToFile
toモディファイア(またはfileモディファイア)、valueディファイア(またはcontentモディファイア)を指定して、サーバー上のファイルに書き込みます。環境変数 CanWriteTo に許可するパス(前方一致)をカンマ区切りで指定することができます。環境変数 PathToRelative に1を指定すると、ブログのファイルパスに指定した値を足したパスに調整します。appendモディファイアと glueモディファイアを指定すると、glueモディファイアの値を区切り文字として追記モードとなります。 need_resultモディファイアを指定すると成功した時に「1」を返します。
<MTWriteToFile to="/path/to/file.txt" content="foo" glue="\n" append="1">
先ほど書いたテンプレートの以下の部分を書き換えます。
<MTGetVar name="log">
↓以下に修正
<MTWriteToFile to="/path/to/access.log" content="$log" glue="\n" append="1">
これでアクセスログが書き込まれるか、プレビューで確認します。 あとは、エクスポートして書き出せば<MTAccessLog>タグをアーカイブテンプレートに埋め込むだけでアクセスログが取得できるようになります。
変数の受け渡しをできるようにする
ここまでで使えるようにはなりましたが、アクセスログのパスがプラグインに直に書かれているため汎用性があまりありません。そこで「MTAccessLog」タグに pathモディファイアを指定してログファイルのパスを指定できるようにします。
MT Studioで作成したテンプレート・タグプラグインでは、以下のルールでモディファイアに渡した値を受け取ることができます。
MTVar(MTGetVar) name="テンプレートタグ名(すべて小文字).(ドット)モディファイア名"
つまり、以下のように受け渡しできます。
<MTAccessLog path="/path/to/access.log">
↓コード側では
<MTGetVar name="accesslog.path">
先ほど書いたテンプレートの以下の部分を書き換えます。
<MTWriteToFile to="/path/to/access.log" content="$log" glue="\n" append="1">
↓以下に修正
<MTWriteToFile to="$accesslog.path" content="$log" glue="\n" append="1">
ついでに、debugモディファイアを指定して処理を分岐することを考えてみます。また、モディファイア指定を忘れた際に警告を表示するようにしてみます。
<MTIf name="accesslog.path">
<MTIf name="accesslog.debug">
<MTGetVar name="log" escape="html">
<MTElse>
<MTWriteToFile to="$accesslog.path" content="$log" glue="\n" append="1">
</MTIf>
<MTElse>
<p>There is no specification of the path attribute.</p>
</MTIf>
アーカイブテンプレートでは、以下のように指定できます。
<MTAccessLog path="/path/to/access.log" debug="1">
ログを日毎に分割する
<MTIf name="accesslog.path">
↓の後に以下の分岐を入れる
<MTIf name="accesslog.dayly">
<MTGetVar name="accesslog.path" escape="html" regex_replace="/\.[^.]*$/","" setvar="path_basename">
<MTGetVar name="accesslog.path" escape="html" regex_replace="/^.*\.([^.]*)$/","$1" setvar="path_extension">
<MTDate format="%Y%m%d" setvar="ymd">
<MTSetVarBlock name="accesslog.path"><MTGetVar name="path_basename">_<MTGetVar name="ymd">.<MTGetVar name="path_extension"></MTSetvarBlock>
</MTIf>
=> /path/to/access_20150107.log
エクスポートする
エクスポート方法については、前々回のエントリをご覧ください。このプラグインを再配布する際には、StudioPlayerをあわせて配布するようにしてください。尚、配布するプラグインのライセンスについても前々回のエントリをご覧ください。
応用例
「MTGetCookie」や「MTIfLogin」タグ等を絡めてユーザーのトラッキング情報を保存したり、カテゴリ情報をログに残すなど、MTタグで色々なカスタマイズが考えられると思います。
完成したプラグインのダウンロード(ライセンスはGPL v2)
※ 実行にはDynamicMTMLが必要です。
コメントを投稿する