- not so Frequently Asked Questions - update 2004/11/29
|
|
|
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 |