gnuplot / webplot / access_plot

集計結果のプロット

定期的に集計結果をプロットしておく方法

集計結果を自動的にプロットしてGIFやPNGに出力するperlのスクリプトを
作ります.これを使って,定期的(週に1度や月に一度)集計結果をプロットし
たイメージを更新します.htmlに図を取り込むには,普通の<img src=>
のタグを使います.前節で作ったwebplot.pl
をもう少し拡張しましょう.

$logfile='/path/to/access_log';
$gnuplot='/path/to/gnuplot';
$imgfile='/path/to/access.png';

最初にlogファイル,出力するイメージファイル,それからgnuplotのPATH
を定義しておきます.gnuplotのインストール場所などは環境毎に異なるでしょ
うから,適当に自分の環境に合わせて絶対PATHで指定します.出力画像のファ
イル名$imgfileは何でも構いませんが,上の例ではとりあえずPNGの
拡張子を付けています.

open(LOG,$logfile);
while(<LOG>){
if(/.html/){
split;
$day = substr($_[3],1,2);
$mon = substr($_[3],4,3);
$year= substr($_[3],8,4);
$count[$day]++;
}
}
close(LOG);

$day=$#count;
$count[$day+1]=$count[$day];

この部分は,前節とほぼ同じですが,標準入力から読み込むのではなく,log
ファイルの名前を与えてファイルをopenしています.勿論,標準入力を使
うことも可能です.また,年と月をグラフの表題として描くために,変数
$mon, $yearを追加しています(logファイルが毎月更新されてい
る事を暗に期待しています).

最後の2行は,右端(31日目)のデータがヒストグラムできちんと描かれるよ
うに,一日前と同じ数字を追加したものです.

& make_gnuplot;
open(GNUPLOT,"| ".$gnuplot);
foreach $i (0..$#plot){ print GNUPLOT $plot[$i]; }
for($i=1;$i<=$#count;$i++){
printf(GNUPLOT "%10d%10dn",$i,$count[$i]);
}
print GNUPLOT "endn";
close(GNUPLOT);
exit 0;

集計結果をgnuplotに与えてプロットする部分です.gnuplotに与える種々の
コマンドは,配列$plotに入っており,これは次のsubroutineで
与えられています.

sub make_gnuplot{
$i=0;
$plot[$i++]=sprintf("set term png colorn");
$plot[$i++]=sprintf("set output '%s'n",$imgfile);
$plot[$i++]=sprintf("set size 0.7,0.7n");
$plot[$i++]=sprintf("set xrange [0:32]n");
$plot[$i++]=sprintf("set yrange [0:*]n");
$plot[$i++]=sprintf("set xtics 1,7,31n");
$plot[$i++]=sprintf("set mxtics 7n");
$plot[$i++]=sprintf("set nokeyn");
$plot[$i++]=sprintf("set gridn");
$plot[$i++]=sprintf("set title '%s %s'n",$mon,$year);
$plot[$i++]=sprintf("plot '-' with stepn");
}

ここでは出力はPNGになっています.以下, set size set
xtics
で図のミテクレを変えています.PNGの画像は,defaultでは
640×480 pixelになりますが,これを縦横70%に縮小しています.最後の行
で,plotするファイル名に標準入力 ‘-‘ を指定しています.これによって,
中間ファイルを作ること無く,$countの内容をgnuplotに流し込
むことが可能になります.

このスクリプトを走らせると,access_logを1ヵ月分集計したグラフができあ
がります.毎日updateする程は無いでしょうから,週に1回程度このスクリ
プトをcronで自動的に起動して,access.pngを更新するようにします.

access_log.png
up