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

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

広告

CentOS, apacheのログをリアルタイム閲覧するapachetop

よくあるtopコマンドのように、apacheのログファイルをリアルタイムに解析するツール。

http://www.webta.org/projects/apachetop

yumでやりたかったので探したらrpmforgeにあった。

# yum --enablerepo=rpmforge search apachetop
apachetop.i386                           0.12.6-2.el5.rf        rpmforge

osxなら、sudo port install apachetop

解析できるログフォーマットはapacheデフォルトのcommonかcombinedだけのようです。

使い方

# apachetop -f 2009-05-29.txt

結構いい感じにリクエストを解析してくれてる。

AWStats 6.0 アクセス解析ツール

ログ解析ツールAWStatsのインストールメモ

環境はLinux+apacheという前提で進めます。

AWStatsよりダウンロード。
ダウンロードしたファイルを解凍してブラウザから見える位置におく。

基本的に変更するところだけ抜粋。変更しないならそのままで良いかと。
設定ファイルの編集
vi awstats.model.conf

# 解析するログファイルの位置
# apacheのログフォーマットをcombined
LogFile="/usr/local/apache2/logs/access_log"

# LogTypeはWebにするのでW
# メールならM
# FTPならF
LogType=W

# ドメイン名
SiteDomain="www.charmface.net"

# DNSの逆引きはしない
DNSLookup=0

# 年間情報の出力をする
AllowFullYearView=3

# 自分のアクセスは解析からはずす
SkipHosts="192.168.1.99"

ファイルを実行して静的ファイルを作成
./awstats.pl -config=awstats.conf -update
./awstats.pl -config=awstats.conf -output -staticlink > usage.html

ブラウザからチェックして確認。
英語になっていると思いますが、OKボタンを押して動的ファイルを読み込むと日本語で表示されると思います。
あまりログファイルサイズが大きいと失敗するかもしれません。

Webalizerで複数ログ解析

VirtualHostで複数ホストを設定した場合ログも複数書き出す設定をする。
apache設定

#通常のログ
CustomLog logs/access_log common
ErrorLog logs/error_log

<VirtualHost *:80>
DocumentRoot /home/www_twintail/
ServerName http://www.twintail.tv
#VirtualHostのログ
ErrorLog logs/twintail-error_log
CustomLog logs/twintail-access_log combined (リファラもログをとる)
</VirtualHost>

webalizer.confをコピーして保存。
webalizer.twintail.conf
LogFile /usr/local/apache2/logs/twintail-access_log
OutputDir /usr/local/webalizer/twintail
HistoryName /var/lib/webalizer/webalizer.twintail.hist
IncrementalName /var/lib/webalizer/webalizer.twintail.current

複数の解析をするには
/$BINDIR/webalizer -c /CONFDIR/webalizer.conf
/$BINDIR/webalizer -c /$CONFDIR/webalizer.twintail.conf
のような感じ。

SNMP

MRTGにて必要なので、細かい設定等は割愛

wget http://optusnet.dl.sourceforge.net/sourceforge/net-snmp/net-snmp-5.1.2.tar.gz
tar net-snmp-5.1.2.tar.gz
cd net-snmp-5.1.2
./configure
make
make install

cp /usr/local/src/net-snmp-5.1.2/EXAMPLE.conf /usr/local/share/snmp/snmpd.conf

ファイルを編集する
自動起動ファイルを編集
スクリプトはどこかに落ちていたものを使用

chkconfig --level 3 snmpd on
/etc/rc.d/init.d/snmpd start

ps aux | grep snmpd
で確認しておく。

analog

rpmからインストール
wget http://download.trilithium.net/analog/analog-5.32/analog-5.32-1.i386.rpm
rpm -ivh analog-5.32-1.i386.rpm

tar.gzからインストール
wget http://www.analog.cx/analog-5.32.tar.gz
tar zxvf analog-5.32.tar.gz
cd analog-5.32.tar.gz
make

mkdir /usr/local/analog
cp -R analog analog.cfg analgform.pl lang/jpeform.html ./lang ./images /usr/local/analog/

##以下設定##
vi anlgform.pl
$analog = '/usr/local/analog';

設定ファイルに以下を追加した
vi analog.cfg
LOGFILE /usr/local/apache/logs/access_log
## LOGFILE /old/logs/access_log.*
OUTFILE index.html
HOSTNAME "[blog.charmface.net]"
LANGUAGE JAPANESE
LANGFILE lang/jpe.lng
DESCFILE lang/jpedesc.txt
DOMAINSFILE lang/jpedom.tab

### DNS ###
DNS WRITE
DNSFILE dns.txt
DNSGOODHOURS 168

### 解析除外ホスト ###
HOSTEXCLUDE localhost
HOSTEXCLUDE 192.168.0.*

### レポートを取るものを個別設定
### とらない場合は OFF
### ほかにもたくさんある
YEARLY ON
MONTHLY ON #月別
WEEKLY ON #週別
DAILYREP ON #日別
DAILYSUM ON #曜日別
HOURELYREP ON #時間別
HOURELYSUM ON #時間別集計
WEEKHOUR ON #曜日別時間
SEARCHQUERY ON #検索語句
SEARCHWORD ON #検索語
INTSEARCHQUERY ON #内部検索語句
INTSEARCHWORD ON #内部検索単語
HOST ON #ホスト
REFERRER ON #リファラ
REDIRREF ON #リダイレクトされたリンク元
FULLBROWSER ON #ブラウザ
OSREP ON #OS

cron設定
crontab -e
0 * * * * /usr/local/analog/analog

ログ解析開始
/usr/local/analog/analog

コピーするファイルは環境に合わせておかないとブラウザから見ることができないです。
vi httpd.conf
Alias /logs/usage/analog /usr/local/analog

Webalizer

GDが必要。
wget ftp://ftp.mrunix.net/pub/webalizer/webalizer-2.01-10-src.tgz
cd webalizer-2.01-10
./configure --with-language=japanese
make
make install

/etc/webalizer.conf に、apacheログファイルのパスと保存先ディレクトリを指定する。

実行
/usr/local/bin/webalizer

ブラウザで確認。

1時間に一回実行させる。
crontab -e
0 * * * * /usr/local/bin/webalizer