トップ > Perl Tips > アクセスログ取得スクリプトを作ろう


 ■ アクセスログ取得スクリプトを作ろう

基礎編:環境変数とは

今回は環境変数を使って、アクセスログをとります。
ログをとるスクリプト、ログを表示するスクリプト、ログをとる対象のファイルが必要です。
今回はSSIを使ってスクリプトを起動させます。

<ログを取得するスクリプト>


#!/usr/bin/perl

print "Content-type:text/html\n\n";

# ログファイル
$log = "acclog.dat";

# ホスト名、IPアドレスを取得
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq "" || $host eq $addr) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
}

# 現在時間の取得
$time = time;

# ログの書き込み
open(OUT,">> $log");
flock(OUT, 2);
print OUT "$time<>$ENV{'REQUEST_URI'}<>$host\n";
close(OUT);

<ログを表示するスクリプト>
#!/usr/bin/perl

# ログファイル
$log = "acclog.dat";

# ログの読み込み
open(IN,"$log");
flock(IN, 1);
@logs = <IN>;
close(IN);

# ログの表示
print "Content-type: text/html\n\n";
print "<html>\n";
print "<head>\n";
print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
print "</head>\n";
print "<body>\n";

print "<table border=\"1\">\n";
print "<tr><td>時間</td><td>ページ</td><td>ホスト</td></tr>\n";

foreach (reverse(@logs)) {
($time,$page,$host)=split(/<>/);
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time);
$mon++;
$year = 1900+$year;
$mon = sprintf("%.2d",$mon);
$mday = sprintf("%.2d",$mday);
$hour = sprintf("%.2d",$hour);
$sec = sprintf("%.2d",$sec);
$min = sprintf("%.2d",$min);
$date = "$year/$mon/$mday $hour:$min:$sec";
print "<tr><td>$date</td><td>$page</td><td>$host</td></tr>\n";
}

print "</table>\n";
print "</body></html>\n";

<HTMLファイル(参考)>
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=Shift_JIS">
<TITLE>アクセスログ</TITLE>
</HEAD>
<BODY>
<P ALIGN="CENTER">アクセスログ</P>
<!--#include virtual="/script/acc_get.cgi" -->
</BODY>
</HTML>
<解説(スクリプト)>

<ログを取得するスクリプト>
$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if ($host eq "" || $host eq $addr) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
}
ここで、リモートホストorリモートアドレスを取得します。
リモートアドレスしか取得できない場合、リモートホストに手動で変換しますが、
できない場合はそのままにします。

$ENV{'REQUEST_URI'}は、ログを取る対象のファイル名です。


<ログを表示するスクリプト>
ログを一覧表示します。

($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($time);
(中略)
$date = "$year/$mon/$mday $hour:$min:$sec";
ここは、時間のデータがグリニッジ標準時での1970年からの経過秒になっていますので、
それを通常のフォーマットにします。




トラックバック

このエントリーのトラックバックURL:
http://easycgi.xrea.jp/mt-tb.cgi/50