Apacheアクセスログと私(サイト内遷移表示のバグ取り)

今日はサイト内遷移表示のバグ取り.

こないだ書いたコード"をよくよく見てみると,

trace.sort.each{|ip, value|
(略)

と書いてるくせに,中でもらっている変数がlineになっていた.これがおかしい元凶であるような気がする.

それで,書き換えてみた.書き換えの際,また繰り返すのがこの部分で,計算も繰り返しでする部分があって,1回目だけ通るのがここで,等と考えているうちにまた訳が分からなくなる.

それと,ハッシュのハッシュを配列のハッシュにしたので,その部分も書き換え.それと,無視するファイルも文末一致で除く物と,文中どこであれ除く物とに増やしたので,書き換えている.

#ページ内遷移表示関数
#IPアドレス順に並び替えて,requestしたファイルを表示する.
def trace_view(file)
  header_out("ページ内遷移")

  logfile = open(file)
  ignore = Regexp.new("#{IGNORE_FILE_END}$|#{IGNORE_FILE}")
  #必要な行をとりあえずハッシュに保持
  trace = Hash.new
  while logline = logfile.gets
    line = Accesslog.new(logline)
    #無視するファイルは処理しない
    unless ignore =~ line.requestURI
      #必要行lineをtrace[ip]に入れていく.
      #traceはハッシュで,{Key => Array}.
      unless trace.key?(line.ip)
        trace[line.ip] = Array.new
      end
      #行を保持
      trace[line.ip] << line
    end
  end
  #得られた行を表示
  trace.each{|ip, value|
    print "<h3> " + ip + "</h3> \n"
    value.each_with_index{|line, i|
      if i == 0
        print "<h4> #{line.user_agent}</h4> \n"
        print "<ol> \n"
      end
      t_last = Time.mktime(line.year, line.month, line.day, line.hour, line.minute, line.second)
      unless i == 0
        period = conv_sec(t_last - $t_prev)
        print "<br> \n↓<br> \n↓ #{period}<br> \n↓</li> \n"
      end
      $t_prev = t_last #t_prevに前の時間を保持
      print "<li> "
      print "#{line.requestURI}(#{line.month}月#{line.day}日"
      print "#{line.hour}時#{line.minute}分#{line.second}秒)"
    }
    print "</li> \n"
    print "</ol> \n"
  }

  footer_out() #フッタ表示
end

conv_secは,引数にもらった数を秒数として,○時間○分○秒という文字列を返すメソッド.

# 秒数を引数にもらって,(秒,分,時)という配列を返す.
# 秒数によって,配列の長さは変わる.
TIME_CONV = [ 60, 60 ]
#助数詞
TIME_AN = [ "秒", "分", "時間" ]
def conv_sec(num)
  t = Array.new
  fmt_time = ""
  t[0] = num.to_i
  TIME_CONV.each{|s|
    if t[-1] < s
      break
    else
      t << t[-1] / s
      t[-2] = t[-2] % s
    end
  }
  t.each_with_index{|an, i|
    fmt_time = an.to_s + TIME_AN[i] + fmt_time
  }
  return fmt_time
end

かえって分かりにくくなったかなあ.もし,日とか月とかに拡張するときも配列定数に書き加えるだけでいいかなあと思ったんだけど.

ちなみに,表示結果はこんな具合.うまくいっているような気はする.

今度はロボットのアクセスを分けてみよっと.

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

コメントを投稿

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

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

Powered by Movable Type