突然思い立って,放り出していたアクセスログ表示スクリプトの改良を始める私.
リクエストファイルのアクセス回数を集計する部分を作ります.方針としては,
- イメージやスタイルシート等のファイルのリクエストを除く.
- ロボットのアクセスはとりあえず除く.
- エラーのファイル(そもそも無い物)は除く.
うわ~,前回コード書いたのだいぶ前だったからさっぱり忘れてるよ.幸い,バカみたいにコメントが多いのでどうにかなったが.
#リクエストファイル集計表示
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の問題だから,プログラミングは関係ないけど,そのうちいじってみよう.