- not so Frequently Asked Questions - update 2004/11/29
|
|
|
集計結果のプロット定期的に集計結果をプロットしておく方法集計結果を自動的にプロットして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%10d\n",$i,$count[$i]); } print GNUPLOT "end\n"; close(GNUPLOT); exit 0; 集計結果をgnuplotに与えてプロットする部分です.gnuplotに与える種々の コマンドは,配列$plotに入っており,これは次のsubroutineで 与えられています. sub make_gnuplot{ $i=0; $plot[$i++]=sprintf("set term png color\n"); $plot[$i++]=sprintf("set output '%s'\n",$imgfile); $plot[$i++]=sprintf("set size 0.7,0.7\n"); $plot[$i++]=sprintf("set xrange [0:32]\n"); $plot[$i++]=sprintf("set yrange [0:*]\n"); $plot[$i++]=sprintf("set xtics 1,7,31\n"); $plot[$i++]=sprintf("set mxtics 7\n"); $plot[$i++]=sprintf("set nokey\n"); $plot[$i++]=sprintf("set grid\n"); $plot[$i++]=sprintf("set title '%s %s'\n",$mon,$year); $plot[$i++]=sprintf("plot '-' with step\n"); } ここでは出力はPNGになっています.以下, set size やset xtics で図のミテクレを変えています.PNGの画像は,defaultでは 640x480 pixelになりますが,これを縦横70%に縮小しています.最後の行 で,plotするファイル名に標準入力 '-' を指定しています.これによって, 中間ファイルを作ること無く,$countの内容をgnuplotに流し込 むことが可能になります. このスクリプトを走らせると,access_logを1ヵ月分集計したグラフができあ がります.毎日updateする程は無いでしょうから,週に1回程度このスクリ プトをcronで自動的に起動して,access.pngを更新するようにします. |