end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

webサーバのログにユーザのPC環境を記録

一般のログ分析ツールはユーザのPC環境を収集できない

webサイト分析にawstats等のログ分析ツールを利用している方は多いと思いますが、当然、ログ分析ツールではアクセスログの記録内容以外を分析することができません。

apacheの設定ファイル(httpd.conf)でLogFormatをcombined にしたもログには次のように表示されるだけで、ブラウザとOS情報以外のユーザのPC環境情報は記録されません。

127.0.0.1 - - [13/Sep/2008:10:25:56 +0900] 
  "GET /HtmlTest/index.html HTTP/1.1" 200 447 "-" 
  "Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1" 0

※実際のログは1行です

LogFormat仕様は、以前書いたエントリでも触れています。
http://d.hatena.ne.jp/end0tknr/20080906/1220656929

Google AnalyticsはPC環境を収集できる

先程のログ分析ツールに対して、Google Analyticsではwebサイトのページに埋め込んだjavascriptによりトラッキングを行う為、画面解像度等のユーザのPC環境も収集することができます。


更にイントラネット内からも http://www.google-analytics.com/ga.js へ接続できる環境であれば、Google Analyticsを利用できます。

http://www.google.com/support/analytics/bin/answer.py?hl=jp&answer=55510

ga.js へも接続できない場合、ajax?でPC環境を収集

企業によってはインターネットへの接続が禁止されているイントラネットも存在すると思います。そのような環境でもユーザのPC環境を収集したい場合、XMLHttpRequest (ajax?) を利用するといいのかもしれません。


次のjavascriptは、screenやnavigatorで、画面解像度やCPUのPC環境を取得後、XMLHttpRequestでPOSTすることで、ユーザのPC環境をwebサーバのアクセスログに記録する為のものです。

var rqst = getHttpRqst();

if ( rqst ){

  //PC情報の収集
  var user_info = {};
  user_info["screen_size"] = screen.width + "x" + screen.height;
  user_info["cpu"] = navigator.cpuClass;

  //PC情報のシリアライズ ※1
  var url_arg = "";
  for (key in user_info) {
    url_arg += key + ":" + user_info[key] + "\t";
  }

  //ダミーリクエスト(URL)の作成  ※2
  var url =
    location.protocol +"//"+ location.host + location.pathname +
    "?" + encodeURI(url_arg);
  
  //ダミーリクエスト(URL)の送信 ※3
  rqst.open("POST", url);
  rqst.send(null);
}


function getHttpRqst() {
  if(window.XMLHttpRequest) { //not IE
    return new XMLHttpRequest();
  }

  if(window.ActiveXObject) { //IE
    try {
      return new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      return new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  return null;
}

※1
ワンライナー?のJSON形式にしてもいいかもしれません。
※2
今回の場合、埋め込まれたhtmlに引数(?以降)を追加していますが、ダミーのhtmlファイルを用意し、そのhtmlに引数をつけた方がアクセルログのページビューを変な値にしないと思います。
※3
受信時に起動する関数(rqst.onreadystatechange)を指定していない為、ユーザは何も気付かないはずです。


このjavascriptを html に追記することで、アクセルログにはPC情報が記録されるようになります。

<html>
<head>
<script type="text/javascript" src="mujina.js"></script>
</head>
<body>
Mujina Test
</body>
</html>

127.0.0.1 - - [13/Sep/2008:18:27:01 +0900]
"POST /HtmlTest/index.html?screen_size:1024x768%09cpu:undefined%09 HTTP/1.1"
200 107
"http://localhost/HtmlTest/index.html"
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1" 0

このようにアクセスログに記録しても、そのままの状態ではawstats等のログ分析ツールではユーザのPC環境を表示することはできませんが、perlであれば、Apache::ParseLog等でログをパースすれば、十分に分析することができます。

http://search.cpan.org/perldoc?Apache::ParseLog