アクセスログ集計
#! /usr/local/bin/perl $CHARSET = 'Shift_JIS'; $LOGFILE = './dat/log.dat'; # ログ保存ファイル名 loadForm(); # フォームデータ取り込み print qq(Content-type: text/html; charset=$CHARSET\n\n); print <<END; <html> <head> <title>アクセスログ集計</title> </head> <body> <table width="100%" style="font-size:12px"> <tr> <th><a href="$ENV{'SCRIPT_NAME'}">アクセス数</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=hour">時間別</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=wday">曜日別</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=cookiecount">訪問回数別</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=agent">ユーザーエージェント別</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=addr">IPアドレス別</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=referer">リンク元別</a></th> <th><a href="$ENV{'SCRIPT_NAME'}?mode=log">アクセスログ</a></th> </tr> </table> <hr> END printLog(); # アクセスログ集計・表示 print <<END; </body> </html> END exit; #================================================ アクセスログ集計 sub printLog { my ($i, $key); my @wday = ('日', '月', '火', '水', '木', '金', '土'); open(FILE, "<$LOGFILE"); # ログファイル読み込み eval{ flock(FILE, 1) }; @LOG = <FILE>; close FILE; print qq(<table style="font-size:12px">\n); if($FORM{'mode'} eq "log") { # アクセスログ表示 print qq(<tr>\n); print qq(<th nowrap>カウンター</th>\n); print qq(<th nowrap>日時</th>\n); print qq(<th nowrap>訪問回数</th>\n); print qq(<th nowrap>ユーザーエージェント</th>\n); print qq(<th nowrap>IPアドレス</th>\n); print qq(<th nowrap>リンク元</th>\n); print qq(</tr>\n); for($i = 0 ; $i < @LOG ; ++$i) { my ($count, $tm, $agent, $addr, $referer, $cookiecount) = split(/\t/, $LOG[$i]); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime $tm; $tm = sprintf("%04d/%02d/%02d($wday[$wday]) %02d:%02d", $year+=1900, ++$mon, $mday, $hour, $min); $addr =~ tr/[13579]/*/; print qq(<tr>\n); print qq(<td nowrap>$count</td>\n); print qq(<td nowrap>$tm</td>\n); print qq(<td nowrap align="center">$cookiecount</td>\n); print qq(<td>$agent</td>\n); print qq(<td nowrap>$addr</td>\n); print qq(<td>$referer</td>\n); print qq(</tr>\n); } } else { # アクセスログ集計 for($i = 0 ; $i < @LOG ; ++$i) { my ($count, $tm, $agent, $addr, $referer, $cookiecount) = split(/\t/, $LOG[$i]); my ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime $tm; if($FORM{'mode'} eq "") { # アクセス数集計 $tm = sprintf("%04d/%02d/%02d($wday[$wday])", $year+=1900, ++$mon, $mday); ++$freg{$tm}; } elsif($FORM{'mode'} eq "hour") { # 時間別集計 $hour = sprintf("%2d時", $hour); ++$freg{$hour}; } elsif($FORM{'mode'} eq "wday") { # 曜日別集計 ++$freg{$wday}; } elsif($FORM{'mode'} eq "agent") { # ユーザーエージェント別集計 ++$freg{$agent}; } elsif($FORM{'mode'} eq "addr") { # IPアドレス別集計 $addr =~ tr/[13579]/*/; ++$freg{$addr}; } elsif($FORM{'mode'} eq "referer") { # リンク元別集計 ++$freg{$referer}; } elsif($FORM{'mode'} eq "cookiecount") { # 訪問回数別集計 $cookiecount = sprintf("%5d回目", $cookiecount); ++$freg{$cookiecount}; } } if($FORM{'mode'} eq "") { # 集計結果表示(アクセス数) my ($count) = split(/\t/, $LOG[0]); print qq(<tr><td nowrap>総アクセス数</td><td>$count</td><td></td></tr>\n); foreach $key (sort {$b cmp $a} keys %freg) { print qq(<tr>); print qq(<td nowrap>$key</td>); print qq(<td align="right" nowrap>$freg{$key}件</td>); print qq(<td>); print qq(<hr size="10" color="#ff6633" align="left" width="$freg{$key}"></td>); print qq(</tr>\n); } } else { # 集計結果表示(昇順) foreach $key (sort keys %freg) { print qq(<tr>); if($FORM{'mode'} eq "wday") { print qq(<td nowrap>$wday[$key]曜日</td>); } elsif($key) { print qq(<td nowrap>$key</td>); } else { print qq(<td>?</td>); } print qq(<td align="right" nowrap>$freg{$key}件</td>); if($FORM{'mode'} eq "agent" or $FORM{'mode'} eq "referer") { print qq(</tr><tr><td colspan="2">); } else { print qq(<td>); } print qq(<hr size="10" color="#ff6633" align="left" width="$freg{$key}"></td>); print qq(</tr>\n); } } } print qq(</table>\n); } #================================================ フォームデータ取り込み sub loadForm { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my ($key, $value) = split(/=/, $pair); $FORM{$key} = $value; } }
〔 実行する 〕