CentOS, apacheのアクセスログをMySQLで保存するmod_log_sql

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

実用に耐えられるかちゃんと計測しておこう。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中