Apacheアクセスログと私(サイト内遷移の様子)

ページ内をどんな風に移動しているか表示することを考える.

欲しいのは,htmlを見に来た記録だから,以前作った生ログ表示と同じ条件で行を省く.その後の行の保持はエラーログ表示と似たような動作だ.1つのファイルの閲覧時間も把握できるといいから,次のファイルへのアクセス時間から前のファイルへのアクセス時間を引いて表示させることとする.

#ページ内遷移表示関数
#IPアドレス順に並び替えて,requestしたファイルを表示する.
def trace_view(file)
  header_out("ページ内遷移")
 
  logfile = open(file)
  ignore = Regexp.new(IGNORE_FILE + "$")
  #必要な行をとりあえずハッシュに保持
  trace = Hash.new
  trace_count = Hash.new
  while logline = logfile.gets
    line = Accesslog.new(logline)
    unless ignore =~ line.requestURI #無視するファイルは処理しない
      #必要行lineをtrace[ip][trace_count[ip]に入れていく.
      save_line(trace, trace_count, line.ip, line)
    end
  end
  #得られた行を並べ替えて表示
  trace.sort.each{|ip, value|
    print "<h3>" + ip + "</h3>\n"
    print "<h4>" + line.user_agent + "</h4>\n"
    print "<ol>\n"
    access_time = Array.new
    trace[ip].sort.each{|count, line|
      access_time[count] = Time.mktime(line.year, line.month, line.day, line.hour, line.minute, line.second)
      unless count == 1
        period = access_time[count] - access_time[count - 1]
        if period >= 60
          minute = period.divmod(60)
          print "<br>\n↓<br>\n↓ " + minute[0].to_i.to_s + "分"
          print minute[1].to_i.to_s + "秒<br>\n↓</li>\n"
        else
          print "<br>\n↓<br>\n↓ " + period.to_s + "秒<br>\n↓</li>\n"
        end
      end
      print "<li>" + line.requestURI
      print "(#{line.month}月#{line.day}日"
      print "#{line.hour}時#{line.minute}分#{line.second}秒)"
    }
    print "</li>\n"
    print "</ol>\n"
  }

  footer_out() #フッタ表示
end

save_lineは新たに作った関数で,引数に4つ取る.これは,前に作ったエラーログ表示部と共通で使う.

#必要行を保持する関数
#第1引数,第2引数はハッシュで,2つ揃ってハッシュのハッシュを作り,
#lineを保持する.
#termは,保存するときのハッシュのキーになる
def save_line(saver, saver_count, term, line)
  unless saver.key?(term)
    saver[term] = Hash.new
    saver_count[term] = 0
  end
  saver_count[term] += 1 #ステータスエラーのカウンター
  #ステータスエラーの行を保持
  saver[term][saver_count[term]] = line
end

表示結果

ありゃ?UserAgentがずれてないか?

表示を自分好みにする段階で,最初にこなければ行けないタグがどれで,くれ返さなければいけないのがどこで――と考えているうちに訳が分からなくなった.……美しくないなあ.

あと,秒数から分+秒の表記にするのがうまいこといっていない.これぐらい,メソッドありそうなんだけど,どんなもんだろ.

それに,ロボットの遷移と人の遷移は処理分けたいよなあ.

日時: 2004年10月19日 | PC/Web > Ruby |

コメントを投稿

(空欄でもかまいません)

(メールアドレスは管理人に通知されますが,Web上には表示されません)

Powered by Movable Type