apache2、mysqlはyumでインストール済みの前提で。
http://www.outoforder.cc/projects/apache/mod_log_sql/
ソースファイルをダウンロードして、インストールします。
# wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.101.tar.bz2 # tar jxvf mod_log_sql-1.101.tar.bz2 # cd mod_log_sql-1.101 # ./configure # make # make install
設定を追加します。
# vi /etc/httpd/conf.d/mod_log_sql.conf LoadModule log_sql_module modules/mod_log_sql.so LoadModule log_sql_mysql_module modules/mod_log_sql_mysql.so
VirtualHostに記述できるようです。
# vi /etc/httpd/vhost.conf # DBアクセス情報 LogSQLLoginInfo mysql://ユーザ名:パスワード@localhost/apache2_log # テーブルをつくります LogSQLCreateTables on # MySQLのソケット指定 LogSQLDBParam socketfile /var/lib/mysql/mysql.sock # 記録するテーブル名 LogSQLTransferLogTable access_logs
アクセスログを記録するデータベースをつくります。
mysql> create database apache2_log default character set utf8;
ブラウザからアクセスしてデータベースを確認します。
mysql> select count(*) from access_logs; mysql> desc access_logs; +------------------+----------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------+----------------------+------+-----+---------+-------+ | id | char(19) | YES | | NULL | | | agent | varchar(255) | YES | | NULL | | | bytes_sent | int(10) unsigned | YES | | NULL | | | child_pid | smallint(5) unsigned | YES | | NULL | | | cookie | varchar(255) | YES | | NULL | | | machine_id | varchar(25) | YES | | NULL | | | request_file | varchar(255) | YES | | NULL | | | referer | varchar(255) | YES | | NULL | | | remote_host | varchar(50) | YES | | NULL | | | remote_logname | varchar(50) | YES | | NULL | | | remote_user | varchar(50) | YES | | NULL | | | request_duration | smallint(5) unsigned | YES | | NULL | | | request_line | varchar(255) | YES | | NULL | | | request_method | varchar(10) | YES | | NULL | | | request_protocol | varchar(10) | YES | | NULL | | | request_time | char(28) | YES | | NULL | | | request_uri | varchar(255) | YES | | NULL | | | request_args | varchar(255) | YES | | NULL | | | server_port | smallint(5) unsigned | YES | | NULL | | | ssl_cipher | varchar(25) | YES | | NULL | | | ssl_keysize | smallint(5) unsigned | YES | | NULL | | | ssl_maxkeysize | smallint(5) unsigned | YES | | NULL | | | status | smallint(5) unsigned | YES | | NULL | | | time_stamp | int(10) unsigned | YES | | NULL | | | virtual_host | varchar(255) | YES | | NULL | | | bytes_in | int(10) unsigned | YES | | NULL | | | bytes_out | int(10) unsigned | YES | | NULL | | +------------------+----------------------+------+-----+---------+-------+
テーブルはどうなっているのだろう。
mysql> show table status\G Name: access_logs Engine: MyISAM Version: 10 Row_format: Dynamic Rows: 11 Avg_row_length: 176 Data_length: 1940 Max_data_length: 281474976710655 Index_length: 1024 Data_free: 0 Auto_increment: NULL Create_time: 2009-06-01 20:22:14 Update_time: 2009-06-01 20:26:17 Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment:
ほうほう。自動で作られるとMyISAMになるようだ。
他にも設定できる。
これを設定しないと日毎うん百万リクエストのサーバはレコードがうん百万できちゃいます。
LogSQLRequestAccept .html .jpg .gif .png LogSQLRequestIgnore .exe .ico .php
SetEnvIf、SetEnvIfNoCaseと同じような動きになります。正規表現使えないのかな?
LogFormatみたいなことをやりたい場合は、
LogSQLTransferLogFormat StUR
この場合は、unixtime・いつもの日付・リクエスト部分のみ・リファラ、がレコードに記録されます。
スキーマ情報みたらフィールドはすべて持っていて、設定したフィールドだけ記録されている。ほかのフィールドはNULLで記録。
LogSQLTransferLogFormatの内容。
この内容は公式のドキュメントにもあります。
A User agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows)
a CGI request arguments request_args varchar(255) user=Smith&cart=1231&item=532
b Bytes transfered bytes_sent int unsigned 32561
c Text of cookie $^{\textrm{1}}$ cookie varchar(255) Apache=sdyn.fooonline.net.1300102700823
H HTTP request protocol request_protocol varchar(10) HTTP/1.1
h Name of remote host remote_host varchar(50) blah.foobar.com
I Request ID (from mod_unique_id) id char(19) POlFcUBRH30AAALdBG8
l Ident user info remote_logname varchar(50) bobby
M Machine ID $^{\textrm{2}}$ machine_id varchar(25) web01
m HTTP request method request_method varchar(6) GET
P httpd child PID child_pid smallint unsigned 3215
p httpd port server_port smallint unsigned 80
R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html
r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1
S Time of request in UNIX format time_stamp int unsigned 1005598029
s HTTP status of request status smallint unsigned 404
T Seconds to service request request_duration smallint unsigned 2
t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800]
U Request in simple form request_uri varchar(255) /books-cycroad.html
u User info from HTTP auth remote_user varchar(50) bobby
v Virtual host servicing the request virtual_host varchar(50) http://www.foobar.com
あとはパフォーマンスが気になるところ。
これでもしapacheが捌けるリクエストが1/10とかなったらorz
実用に耐えられるかちゃんと計測しておこう。