2009年2月20日金曜日

JETTY環境でのリクエストロガーの編集

ひさしぶりのLOGは単なる技術メモ。

携帯電話用にログをとる話。
携帯電話には端末固有IDというのがあってなんか主にヘッダに入っています。すべてのアクセスがキャリアのサーバを介す都合上IPアドレスはユニークユーザー識別としては役に立ちません。ユーザーがこれの送信を許可してることを期待してこいつでユニークユーザーをとるとなんかPCで行われているようなトラッキングみたいなことができるんではという話。取得自体は正規表現をいくつか用意してhogeればいいので簡単です。問題はこれをどうログするか。

これが入ってる場所はキャリアごとでマチマチでApacheで設定すれば簡単にとれてくるようなものではありません。

人に聞くとアプリケーション上でデータベースにログするのが主流のようです。毎アクセスごとに。(アクセスログを取るためだけにDBサーバーと通信するんですか) で自作テーブルのカラムにつっこむ。(アクセス解析ツールとか使えませんよねー。自作するんすか)


ところでmvn:jetty runが便利すぎるのでいまだにコンテナにjetty使ってます。このjettyですが。httpサーバーとしても単体動作しログ機能も備えています。

デフォルトのNCSAログの実装がLocaleの設定がまずく、まともに動かないというのは以前ここに書きましたが。この実装は自作のものに置き換えが可能です。素のjettyにおいてログ用クラスのいれかえをどうするかということについては公式に情報があったんですが。

mvn:jetty runでどのように設定すれば置き換えが聞くのか、掲示板にしか情報がなかったのでここに書いておきます。pom.xmlに設定する内容は以下みたいな感じ。

==================================================
<plugin>
 <groupId>org.mortbay.jetty</groupId>
 <artifactId>maven-jetty-plugin</artifactId>
 <version>6.1.14</version>
 <configuration>
     (省略)
  <requestLog implementation="jp.co.xxxxxx.jetty.MyCombinedLog">
   <filename>target/yyyy_mm_dd.request.log</filename>
   <retainDays>90</retainDays>
   <append>true</append>
   <logTimeZone>GMT+9</logTimeZone>
   <logServer>true</logServer>
   <preferProxiedForAddress>true</preferProxiedForAddress>
  </requestLog >
 </configuration>
 <dependencies>
  <dependency>
   <groupId>jp.co.xxxxxx</groupId>
   <artifactId>mylib</artifactId>
   <version>1.0.0</version>
  </dependency>
 </dependencies>
</plugin>
==================================================

jp.co.xxxxxx.jetty.MyCombinedLogというのがNCSARequestLogを身ながら自作したログ用のクラス。でこれをライブラリmylibにつっこんでmvnのローカルリポジトリに投下。pluginタグののdependenciesにつっこんであげると動作する。(もしくはjetty.xmlを作ってそこから参照させてもいいらしい) 普通そんなところにdependenciesがいれられるとはおもわんので難儀しました。
とにかくこれでログアナライザがまともに読むことのできるCombinedログもとれるし、普段使わないcombinedログのuser欄にサブスクライバIDをつっこむこともできるわけです。めでたしめでたし。

0 件のコメント:

コメントを投稿