Apacheアクセスログと私(同一ファイルへのアクセスを集計)

突然思い立って,放り出していたアクセスログ表示スクリプトの改良を始める私.

リクエストファイルのアクセス回数を集計する部分を作ります.方針としては,

うわ~,前回コード書いたのだいぶ前だったからさっぱり忘れてるよ.幸い,バカみたいにコメントが多いのでどうにかなったが.

#リクエストファイル集計表示
def addup(file)
  header_out("ページ集計")
  date_out(file) #処理ファイル表示

  robot_re = robot_name
  ignore = Regexp.new("#{IGNORE_FILE_END}$|#{IGNORE_FILE}",true)
  logfile = open(file)
 
  count = Hash.new(0) #同一ページを数え上げるためのハッシュ
  while logline = logfile.gets
    line = Accesslog.new(logline)
    #無視するファイルは処理しない/エラーコードは処理しない/クローラーは処理しない
    unless ignore =~ line.requestURI || /^[4|5]/ =~ line.status || robot_re =~ line.user_agent
      unless count.key?(line.requestURI) #もし,まだ数えたことのないページなら
        count[line.requestURI] = 1 #ページをキーとするハッシュの要素に1を設定.
      else
        count[line.requestURI] += 1 #すでに数えたことがあれば+1
      end
    end
  end
  #"/"と"/index.shtml"は一緒のファイルなので,合算.
  if count.key?("/") && count.key?("/index.shtml")
    count["/"] = count["/"] + count["/index.shtml"]
    count.delete("/index.shtml")
  end
  print "<h4>リクエストファイル集計</h4>\n<ol>\n"
  #ページをリクエストの多い順に並べ替えて表示
  #同数ならファイルの名前の順に表示
  count.to_a.sort{|a, b|
    (b[1] <=> a[1]) * 2 + (a[0] <=> b[0])
  }.each{|key, value|
    print "<li>#{key}(#{value.to_s}回)</li>\n"
  }
  print "</ol>\n"
  footer_out() #フッタ表示
end

一番苦労したのは,ハッシュを降順に並べ替えることだったりする.逆引きRubyのハッシュの項を参考にしました.というよりもそのままパクりました.いまだに<=>演算子の動きがよく分からない私.

出力結果.

そして,聖剣伝説の感想を書いたページへのアクセス数が一番多いという驚愕の事実が!!(笑)

いや~,ジョジョページとfdページ(起動ディスクの作り方とかフォーマットの仕方がメモってある)にアクセスが多いのはうすうす気づいてたけど,そんなところが多いとは!

と,一通り驚いたところで,あとは体裁だね.体裁はHTMLの問題だから,プログラミングは関係ないけど,そのうちいじってみよう.

日時: 2005年11月 5日 | PC/Web > Ruby |

コメントを投稿

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

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

Powered by Movable Type