どのページが閲覧されたかを知る(2)

前述した単純なページビュー取得サンプルは何も考えずに結果を計算していました。 アクセスログには、成功したHTTPリクエストだけでなく、失敗したリクエストも記述されています。 そのため、前述した単純な例では存在しないURLなども結果の中に含めてしまっていました。 ここでは、成功したHTTPリクエストだけから解析を行う方法を説明したいと思います。

成功したリクエスト以外を除外する

6番目のデータは、HTTPリクエストに対するHTTP STATUS CODEの値が入っています。 (apacheのcombined logを前提にしています。必要に応じてサンプルを変えてください。) ここの値が200の時、HTTPリクエストは正常に処理されています。 逆に、200以外の時には何かが発生しています。 例えば、404は存在しないURLがリクエストされた事を表しています。

200以外でも正常な処理はあります。 例えば、304は「以前から更新が無い」ということを表しています。 304は主に画像ファイルなどで使われます。 304を受け取ったブラウザは手元のcacheを使ったりします。 恐らく、200以外を除外してもあまり問題にはならないと思いますが、必要に応じて200以外にもサンプルを改造して対応して下さい。

ここでは、HTTPステータスコードが200以外の場合にはページビュー数をカウントしません。 以下に、perlスクリプトのサンプルを示します。 単純な例との差分は強調してある部分です。


#!/usr/bin/perl

# (注意)/usr/bin/perlの部分は必要に応じて変更してください。

# (注意)"access_log.txt"は解析するアクセスログのファイル名に
#  変更してください。
open(LOGFILE, "access_log.txt") || die $!;

# 一行ずつアクセスログファイルを読みます。
while (<LOGFILE>) {

  # perlのパターンマッチを行っています。
  # $1,$2,...$9にマッチした結果が入ります。
  /^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;

  # HTTP STATUSが200でないものは除外します
  # 200はOK(成功)を示します
  $httpstatus = $6;
  if ($httpstatus != 200) {
    # 以後の処理は行わず、もう一度while文の最初に行きます
    next;
  }

  # パターンマッチの結果を変数に代入しています。
  $httprequest = $5;

  # スペースで区切ります
  @cols = split(" ", $httprequest);

  # とりあえず、今回のサンプルではGETだけ気にします
  # cgiに関して調べたいときなどには必要に応じてPOSTなどにも対応して下さい

  if ($cols[0] eq "GET") {

    # 2つ目のデータにリクエストされたURLが入っています
    $url = $cols[1];

    # 取得したURLをキーにした連想配列の値を増やします
    $urlcount{$url}++;
  }
}
close(FILE);

# 連想配列に覚えさせたページビュー数を表示します
# $keyには、URLが入っています
# $valueには、ページビュー数が入っています

while (($key, $value) = each(%urlcount)) {
  print "$value\t$key\n";
}

exit;


IPv6基礎検定

YouTubeチャンネルやってます!