httpd access_logの解析・集計
apacheのlogfileの集計を簡単にするために,このファイルが毎月新しく
作り直されている状況を考えます.logファイルはすぐに巨大になってしまう
ので,多くのWWW Serverではこの処理を自動的に行っているはずです.
apacheのaccess_logは,標準では次のようになっています.
host.domain - - [01/Jan/2000:01:23:45 +0900] "GET /index.html HTTP/1.1" 200 1548
host.domain - - [01/Jan/2000:01:23:50 +0900] "GET /icons/mail.png HTTP/1.1" 200 229
|
まずは,細かいことは無視して,何日にいくつのアクセスがあったのか,
だけを数えましょう.必要なのは, [01/Jan/2000: の中の01の部
分です.同じ日のアクセスを1日から31日までに対してそれぞれ合計します.
#!/usr/bin/perl
while(<>){
if(/\.html/){
split;
$day = substr($_[3],1,2);
$count[$day]++;
}
}
for($i=1;$i<=$#count;$i++){
printf("%10d %10d\n",$i,$count[$i]);
}
|
access_logには全てのファイルへのアクセスが記録されますので,画像ファ
イル等へのアクセス数をカウントしないように,htmlが付く行のみを処理して
います.特定のURLだけをカウントするなら,ifの部分をもう少ししっかり作る
必要があります.
まず各行の要素を,スペースで分割し,日にちの部分をsubstrを
使って切りだします.これを変数$dayに代入し,$day日の
カウンタを一つ増やします.ファイルを全部読み終えたら,日にち毎のカウン
ト数を書き出します.上のperlのスクリプトを webplot.plという名前にして
おきます.
これは某所サーバへの
2000年1月のアクセスの集計結果です.
1 172
2 321
3 208
4 279
5 327
.... ....
25 588
26 1038
27 848
28 772
29 570
30 495
31 548
|
この結果をファイルにdumb terminalを使ってプロットすると,次のように
なります.ここで "< webplot.pl access_log" の最初の不等号は,perlの
プログラムの処理結果をプロットするデー
タとして読み込むことを表します.
gnuplot> set term dumb
Terminal type set to 'dumb'
Options are 'feed 79 24'
gnuplot> plot "< webplot.pl access_log" with step
1600 ++--------+---------+---------+---------+---------+---------+--------++
+ + + + "< webplot.pl access_log" ****** +
1400 ++ *** ++
| * * |
| * * |
1200 ++ * * ++
| * * |
1000 ++ *** * * *** ++
| * * * * * * |
| * * * * * *** |
800 ++ * * * * * *** ++
| * * *** * * * * |
600 ++ *** * *** * * * * * ++
| *** * * * *** * ***** *** * |
| * * * ******* * * * *** |
400 ++ * * * *** *** *** ++
| *** *** * * ***** * * |
200 ++ * ***** *** *** *** ++
| *** |
+ + + + + + + +
0 ++--------+---------+---------+---------+---------+---------+--------++
0 5 10 15 20 25 30 35
|
|