※ パクレゼルヴではWeb開発エンジニアを大募集中!詳細はこちら
Home > Apache, MySQL, Tips, データベース > アクセスログ

アクセスログ  

2008/8/25 月曜日 11:27:10

はいどうも
のびーにょです

表題のとおりなんですけど、皆さんアクセスログってどう処理してます?

僕の場合はシステム側でDBに取るようにしてます。

オーバーヘッドとか色々考えなきゃだめな部分ありますけど、割と便利です。

まず、Apacheの標準のアクセスログだとPOSTの値がとれません。

※こんな方法もあったりしますが
http://neta.ywcafe.net/000607.html

で、僕はアクセスすべてをDBに保存しています。
レコード数が多くなりすぎたりすると処理に時間がかかってしまいますので月別、週別でアーカイブしていったり、場合によっては日別でテーブルを分けるなどの処理が必要ですが・・・
以下bash

#!/bin/bash
mysql -uユーザ名 -pパスワード rutty_test -hホスト << EOT
ALTER TABLE access_log RENAME AS access_log_`date +%Y_%m_%d`;
CREATE TABLE \\`access_log\\` (
  \\`id\\` int(11) unsigned NOT NULL auto_increment,
  \\`access_date\\` datetime NOT NULL,
  \\`carrier\\` enum('DOCOMO','EZWEB','SOFTBANK','OTHER')NOT NULL default 'OTHER',
  \\`u_id\\` int(11) unsigned default NULL,
  \\`jb\\` varchar(255) NOT NULL,
  \\`parameter\\` longtext,
  PRIMARY KEY  (\\`id\\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

EOT

とかのBASHを日別とか週別とか月別とかで実行してやればテーブルのサイズはそんなに大きくなることはないと思います。

フレームワークとか使っているならPOSTとかGETで受け取るものはすべてラッピングできると思うので、そこでDBにほりこんでおけばすべての値を得ることができると思います。

アクセスログをDBに入れておくと何が嬉しいか

集計するとき楽なんですよね。

ちなみに上にあるアクセスログのテーブルのカラムの一つ”jb”ってのは僕の使っているフレームワークののページ名です。
それ集計するだけで日別の各ページのアクセス数がとれるのですごく楽です。

携帯メインなのでキャリアの情報も格納しておけばさらにキャリア別でとれるし。

さっきのBASHを少し変えて、1週間前のテーブルなら削除するとかの処理入れておけばDBもそんなに大きくならなくていいかなーと思います。
集計結果を保存しておくテーブルは当然別につくり、cronとかで日別集計、週別集計、月別集計のバッチ組んでやれば古いデータは必要ないですし、CDなりDVDなりに焼いてやればHDDも圧迫しませんし。
POSTの値も保存できるので作ったアプリケーションの障害時に何が原因かってのも追えますしね。
結構お勧めです。

のびーにょ Apache, MySQL, Tips, データベース

  1. No comments yet.
  1. No trackbacks yet.