Hatena::Grouprubyist

Rubyを勉強しようと思ってはじめた日記

2008-04-26

Rubyでアクセス解析をする(0.7)データベースに保存する

| 16:53 | Rubyでアクセス解析をする(0.7)データベースに保存する - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.7)データベースに保存する - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.7)データベースに保存する - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

テーブル定義

  • 初めてDBを使うのでよくわからないけれど、定義してみた
  • これでいいかはわからないけれど、あれこれしてみようと思います
create table entry(
 entry_id int auto_increment primary key,
 url text,
 ref text,
 ua text,
 access_date timestamp
);

定義してみた結果

mysql> show columns from entry;
+-------------+-----------+------+-----+-------------------+----------------+
| Field       | Type      | Null | Key | Default           | Extra          |
+-------------+-----------+------+-----+-------------------+----------------+
| entry_id    | int(11)   | NO   | PRI | NULL              | auto_increment | 
| url         | text      | YES  |     | NULL              |                | 
| ref         | text      | YES  |     | NULL              |                | 
| ua          | text      | YES  |     | NULL              |                | 
| access_date | timestamp | NO   |     | CURRENT_TIMESTAMP |                | 
+-------------+-----------+------+-----+-------------------+----------------+

ActiveRecordを使って保存

  • 日付は指定しないと、insertを行った日付がINSERTされる
  • Timeオブジェクトを、timestampのカラムに渡すときちんと日付で入れてくれる
  • #saveによって保存される

Rubyスクリプト

ログファイルを読み込んで、MySQLに流し込でみました。

  • 画像ファイルとか、cssファイルとかのアクセス数はいらない
  • 一部エラーが出た「no implicit conversion from nil to integer (TypeError)」
require 'rubygems'
require 'active_record'
require 'date'
require 'time'

ActiveRecord::Base.establish_connection(
   :adapter  => 'mysql',
   :host     => 'localhost',
   :username => 'root',
   :password => 'mysql',
   :database => 'access_log'
)

class Entrys < ActiveRecord::Base
    set_table_name "entry"
end

montn_array = { 
    'Jan' => 1,
    'Feb' => 2,
    'Mar' => 3,
    'Apr' => 4,
    'May' => 5,
    'Jun' => 6,
    'Jul' => 7,
    'Aug' => 8,
    'Sep' => 9,
    'Oct' => 10, 
    'Nov' => 11, 
    'Dec' => 12
}

logfile = '../access_log'
logs    = open(logfile,'r')
while text = logs.gets do
/^([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^ ]*)(?: *([^ ]*) *([^ ]*))?" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/u =~ text
    entry = Entrys.new
        entry.url = $6
        entry.ref = $10 
        entry.ua  = $11 
        /^(.*)\/(.*)\/(.*):(.*):(.*):(.*) \+0900/ =~ $4
        at_time = Time.local($3, montn_array[$2], $1, $4, $5, $6) 
        entry.access_date = at_time
    entry.save
end
logs.close
カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2009 | 06 | 08 |