GNUPLOT

- 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
up