アクセスログ集計
#! /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;
}
}
〔 実行する 〕