CGI研究室:アクセスログアナライザー

 長らく使用していたアクセスログカウンターを公開したいと思います。このアクセスログカウンターは時間別&ブラウザー別にアクセスをカウントし記録します。

 ファイルはログファイルが全部で4つ。SHシェルコマンドが2種類。CGIスクリプト(Perl)が一つで構成されています。

 ファイルの使用に関して、ログファイルは「書き込み可能」な属性。Perlスクリプトファイルは「実行可能属性」。SHシェルコマンドを含むHTMLファイルはSH・UNIXシェルコマンドが利用可能な拡張子の指定などを行ってください。

 

アクセスログを取るためのSHTML(SHシェルコマンド)

<!--#config timefmt="%x"-->
<!--#exec cmd="/usr/home/dialup/3webnet/kitaro/public_html/cgi-bin/log/aclog3.cgi" -->
<!-- アクセスログ&カウンター v3.00 -->

アクセスログを表示するためのSHTML(SHシェルコマンド)

<HTML>
<HEAD><TITLE> access log viewer v3.0 </TITLE></HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="60;URL=aclog3.shtml">
<BODY BGCOLOR="ffe8ff" >
<!-- #exec cmd="/usr/home/dialup/3webnet/kitaro/public_html/cgi-bin/log/aclog3.cgi" --><BR>
<!-- #config timefmt="%m/%d %H:%M"-->
<FONT SIZE=4>
 これらのリストはCGIの動作テスト用に使用しています。<BR>
このスクリプトは公開する予定です。<BR>
<BR>
<HR>
ブラウザ別アクセスログ<BR>
<TABLE BORDER="3" WIDTH="99%" >
<TR>
<td>Windows 95</td>
<td>Windows NT</td>
<td>Windows 3.1x</td>
<td>UNIX</td>
<td>Mac(PPC)</td>
<td>Others</td>
<td>MSIE 3.0x</td>
<td>MSIE 4.0x</td>
<td>Netscape 2.0x</td>
<td>Netscape 3.0x</td>
<td>Netscape 4.0x</td>
<td>Other Browser</td>
</TR>
<TR>
<!--#include virtual="/~kitaro/cgi-bin/log/ac_log3b.log"-->
</TR>
</TABLE>
<BR>
<HR>
時間別アクセスログ<BR>
<TABLE BORDER="3" WIDTH="99%" >
<TR>
<td>00</td><td>01</td><td>02</td><td>03</td><td>04</td>
<td>05</td><td>06</td><td>07</td><td>08</td><td>09</td>
<td>10</td><td>11</td><td>12</td><td>13</td><td>14</td>
<td>15</td><td>16</td><td>17</td><td>18</td><td>19</td>
<td>20</td><td>21</td><td>22</td><td>23</td>
</TR>
<!--#include virtual="/~kitaro/cgi-bin/log/ac_log3h.log"-->
</TR>
</TABLE>
<BR>
<HR>
<BR>アクセスログリスト<BR>
<BR>
アクセスカウント:
<!--#include virtual="/~kitaro/cgi-bin/log/ac_log3.log"--><BR>

<HR>
Copyright (c) Kitaro 1997<BR>
</FONT>
</BODY></HTML>

アクセスログを記録するためのファイル(ac_log3.log)

1
<br> ns2.sogopr.co.jp : 203.139.118.2 : Mozilla/4.0 (compatible; MSIE 4.01; Windows NT) : 06/18/98 11:57:30 JST

アクセスログを記録するためのファイル(ac_log3b.log)

<!--Win95-->
<TD>
6952
</TD>
<!--WinNT-->
<TD>
1138
</TD>
<!--Win16-->
<TD>
133
</TD>
<!--UNIX-->
<TD>
157
</TD>
<!--Mac-->
<TD>
320
</TD>
<!--Other-->
<TD>
444
</TD>
<!--MSIE3-->
<TD>
3073
</TD>
<!--MSIE4-->
<TD>
1744
</TD>
<!--NAVI2-->
<TD>
246
</TD>
<!--NAVI3-->
<TD>
2632
</TD>
<!--NAVI4-->
<TD>
1130
</TD>
<!--OtherB-->
<TD>
259
</TD>

アクセスログを記録するためのファイル(ac_log3h.log)

<!--00-->
<TD>
0
</TD>
<!--01-->
<TD>
0
</TD>
<!--02-->
<TD>
0
</TD>
<!--03-->
<TD>
0
</TD>
<!--04-->
<TD>
0
</TD>
<!--05-->
<TD>
0
</TD>
<!--06-->
<TD>
0
</TD>
<!--07-->
<TD>
0
</TD>
<!--08-->
<TD>
0
</TD>
<!--09-->
<TD>
0
</TD>
<!--10-->
<TD>
0
</TD>
<!--11-->
<TD>
0
</TD>
<!--12-->
<TD>
0
</TD>
<!--13-->
<TD>
0
</TD>
<!--14-->
<TD>
0
</TD>
<!--15-->
<TD>
0
</TD>
<!--16-->
<TD>
0
</TD>
<!--17-->
<TD>
0
</TD>
<!--18-->
<TD>
0
</TD>
<!--19-->
<TD>
0
</TD>
<!--20-->
<TD>
0
</TD>
<!--21-->
<TD>
0
</TD>
<!--22-->
<TD>
0
</TD>
<!--23-->
<TD>
0
</TD>

アクセスログを記録するためのファイル(ac_log3w.log)

ns2.sogopr.co.jp
203.139.118.2
Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)
06/18/98
11

アクセスログを記録するPerlプログラム(aclog3.cgi)

<!-- アクセスログ&カウンター v2.10 -->

#! /usr/sbin/perl
## cgi アクセスカウンター&アクセスログ Ver3.0 (C) by Kitaro 1997
## CGI and SSI used
## セットアップする時には、Perlディレクトリと'initialize1'をそれぞれの環境に合わせてください
## ファイルの転送時はアスキー転送モードですべてのファイルを転送してください
##

## initialize1
$ac_file = "/usr/home/dialup/3webnet/kitaro/public_html/cgi-bin/log/ac_log3.log"; # アクセスログファイル
$ac_file2 = "/usr/home/dialup/3webnet/kitaro/public_html/cgi-bin/log/ac_log3h.log"; # 時間ログファイル
$ac_file3 = "/usr/home/dialup/3webnet/kitaro/public_html/cgi-bin/log/ac_log3w.log"; # 一つ前のログネーム
$ac_file4 = "/usr/home/dialup/3webnet/kitaro/public_html/cgi-bin/log/ac_log3b.log"; # ブラウザログファイル
$counter_sw = 1; # 0:Counter表示 1:非表示
$log_sw = 1; # 0:Log表示 1:非表示
$log_max = 300; # アクセスログキープ 最大値
$date_command = "/sbin/date";

## initialize2
$log_ck = 1; # 0:すべてのlog記録 1:チェックを入れる
$date = `$date_command +"%A, %B %D, %Y at %T (%Z)"`; chop($date);
$short_date = `$date_command +"%D %T %Z"`; chop($short_date);
$time_date = `$date_command +"%T"`; chop($time_date);
$day_date = `$date_command +"%D"`; chop($day_date);
($hour,$minits,$second) = split(/:/,$time_date,3);

## initialize3
#############################################################
### Log Check
###
if($log_ck == 1 ){
open (FILE3,"$ac_file3") || die " Can't Open $ac_file3: $!\n";
@LINES3=<FILE3>;
close(FILE3);
$SIZE=@LINES3;
$x1=$LINES3[0];
$x2=$LINES3[1];
$x3=$LINES3[2];
$x4=$LINES3[3];
$x5=$LINES3[4];
$d1=$ENV{'REMOTE_HOST'};
$d2=$ENV{'REMOTE_ADDR'};
$d3=$ENV{'HTTP_USER_AGENT'};
if($x1 == $d1 ) {if( $x2 == $d2 ) {if( $x3 == $d3 ) { if( $day_date == $x4 ){ if( $x5 == $hour ){exit;}}}}}
open(OFILE3,">$ac_file3") || die "Can's Open $ac_file3: $1\n";
print OFILE3 "$d1\n";
print OFILE3 "$d2\n";
print OFILE3 "$d3\n";
print OFILE3 "$day_date\n";
print OFILE3 "$hour\n";
close(OFILE3);
}
#############################################################
### Browser Access log
###
$x=$ENV{'HTTP_USER_AGENT'};
$f=0;
if($f eq 0){@ua=split(/95/,$x); $size=@ua; if($size>=2){ $a1="Win95";$f=1;}}
if($f eq 0){@ua=split(/NT/,$x); $size=@ua; if($size>=2){ $a1="WinNT";$f=1;}}
if($f eq 0){@ua=split(/16/,$x); $size=@ua; if($size>=2){ $a1="Win16";$f=1;}}
if($f eq 0){@ua=split(/Mac/,$x); $size=@ua; if($size>=2){ $a1="Mac";$f=1;}}
if($f eq 0){@ua=split(/SunOS/,$x); $size=@ua; if($size>=2){ $a1="UNIX";$f=1;}}
if($f eq 0){@ua=split(/FreeBSD/,$x); $size=@ua; if($size>=2){ $a1="UNIX";$f=1;}}
if($f eq 0){$a1="Other";}

## analyz browser
$f=0;
if($f eq 0){@ua=split(/MSIE 4/,$x); $size=@ua; if($size>=2){ $a2="MSIE4";$f=1;}}
if($f eq 0){@ua=split(/MSIE 3/,$x); $size=@ua; if($size>=2){ $a2="MSIE3";$f=1;}}
if($f eq 0){@ua=split(/MSIE /,$x); $size=@ua; if($size>=2){ $a2="MSIE";$f=1;}}
if($f eq 0){
if($f eq 0){@ua=split(/4.0/,$x); $size=@ua; if($size>=2){ $a2="NAVI4";$f=1;}}
if($f eq 0){@ua=split(/3.0/,$x); $size=@ua; if($size>=2){ $a2="NAVI3";$f=1;}}
if($f eq 0){@ua=split(/2.0/,$x); $size=@ua; if($size>=2){ $a2="NAVI2";$f=1;}}
}
if( $f eq 0) { $a2="OtherB"; }

$htag1 = "<!--$a1-->\n";
$htag2 = "<!--$a2-->\n";

open (FILE4,"$ac_file4") || die " Can't Open $ac_file4: $!\n";
@LINES4=<FILE4>; close(FILE4); $SIZE=@LINES4;
open(OFILE4,">$ac_file4") || die "Can's Open $ac_file4: $1\n";
for($i=0;$i<=$SIZE;$i++){
$x=$LINES4[$i];
$job=0;
if($x eq $htag1){
print OFILE4 "$x";
$i++;
$x=$LINES4[$i];
print OFILE4 "$x";
$i++;
$x=$LINES4[$i];
$counter=$x;
$counter++;
print OFILE4 "$counter\n";
$job=1;
}
if ( $job eq 0){
if($x eq $htag2){
print OFILE4 "$x";
$i++;
$x=$LINES4[$i];
print OFILE4 "$x";
$i++;
$x=$LINES4[$i];
$counter=$x;
$counter++;
print OFILE4 "$counter\n";
$job=1;
}
}
if ( $job eq 0){
print OFILE4 "$x";
}
}
close (OFILE4);


#############################################################
### Access Time Job
###
$htag = "<!--$hour-->\n";
open (FILE2,"$ac_file2") || die " Can't Open $ac_file2: $!\n";
@LINES2=<FILE2>; close(FILE2); $SIZE=@LINES2;
open(OFILE2,">$ac_file2") || die "Can's Open $ac_file2: $1\n";
if ($SIZE >= $log_max){ $SIZE=$log_max; }
for($i=0;$i<=$SIZE;$i++){
$x=$LINES2[$i];
$job=0;
if($x eq $htag){
print OFILE2 "$x";
$i++;
$x=$LINES2[$i];
print OFILE2 "$x";
$i++;
$x=$LINES2[$i];
$counter=$x;
$counter++;
print OFILE2 "$counter\n";
$job=1;
}
if ( $job eq 0){
print OFILE2 "$x";
}
}
close (OFILE2);

#############################################################
### Access Name Log Job
###
open (FILE,"$ac_file") || die " Can't Open $ac_file: $!\n";
@LINES=<FILE>;
close(FILE);
$SIZE=@LINES;
open(OFILE,">$ac_file") || die "Can's Open $ac_file: $1\n";
if ($SIZE >= $log_max){ $SIZE=$log_max; }
for($i=0;$i<=$SIZE;$i++){
$x=$LINES[$i];
$job=0;
if($i eq 0){
$counter=$x;
$counter++;
print OFILE "$counter\n";
    $d1=$ENV{'REMOTE_HOST'};
    $d2=$ENV{'REMOTE_ADDR'};
    $d3=$ENV{'HTTP_USER_AGENT'};
print OFILE "<br> $d1 : $d2 : $d3 : $short_date\n";
if ($counter_sw eq 0) { print "$counter"; }
if ($log_sw eq 0) { print "[ $d1 : $d2 : $d3 : $short_date ]"; }
$job=1;
}
if ( $job eq 0){
print OFILE "$x";
}
}
close (OFILE);
### Convert URL file from cputype
exit;
### end of program

Copyright (c) kitaro 1997-1998