Ruby: Фильтр журнала Apache для HTTP Status и процент их появления - PullRequest
0 голосов
/ 24 марта 2012

У меня есть журнал apache. Я ищу фильтр по кодам HTTP.Я сделал математику вручную, так как моя программа ruby ​​не возвращает правильные числа.Я также планирую использовать этот же код, чтобы, возможно, выводить число посещений по IP-адресам и посещенным URL-адресам, но только если я не смогу заставить свой код работать.

вот что я получил

class Numeric
  def percent_of(n)
    self.to_f / n.to_f * 100.0
  end
end

stat_hash = Hash.new(0)
url_hash = Hash.new(0)
ip_hash = Hash.new(0)
#lineArray= Array.new()
file = File.open("./test_log", 'r')

total = 0

#load hash
file.each_line do |line|
    total += 1
    lnarr = line.chomp.split #Split is messed up needs to split to array first i think then hash from array  similar to Lab 10
   #Array needs to split to {IP,Date/time, URL, Status, size}
   #http://httpd.apache.org/docs/1.3/logs.html
    stat_hash[lnarr[-2]] += 1
    url_hash[lnarr[-4]] += 1
    ip_hash[lnarr[0]] +=1
end

for i in 0..stat_hash.length-1 do
    percent = stat_hash.percent_of(total) #current equation will not work. Hash does populate with the http status do but math
#does not output any average. returns undefined method but method is defined at top.
    status = stat_hash[i]
end

puts total
#puts (stat_hash[i]/total)
stat_hash.sort.each { |status| puts "#{status}:"+ percent}

Журнал испытаний, с которыми я работаю, можно найти здесь: http://dl.dropbox.com/u/71927/test_log

Я сделал это вручную и ожидаю

200:90%
301:8%
401:1%
404:1%

но я получаю

200: 97%
301: 1%
304: 8%
403: 2%

, что просто их количество раз, когда они происходят.если вы сложите их 108, то в файле журнала будет 108 строк с кодами состояния.

РЕДАКТИРОВАТЬ: В качестве продолжения этого вопроса проценты округляются по мере необходимостиони использовали функцию потолка типа данных с плавающей точкой с помощью '.ceil' и получили мои данные для анализа определенных данных, записав в командной строке параметры с помощью optparser

Ответы [ 2 ]

1 голос
/ 24 марта 2012

Имеет смысл использовать csv для файлов журнала:

require 'csv'

statuses, total = {}, 0.0

CSV.foreach('apache.log',:col_sep => ' ') do |row|
    statuses[row[-2]] ||= 0.0
    statuses[row[-2]] += 1
    total += 1
end

statuses.each do |status, count|
    puts "#{status}: #{count/total*100}"
end
1 голос
/ 24 марта 2012

Я не уверен, правильно ли вы скопировали / вставили, но я не вижу, как вы успешно получаете доступ к переменной percent вне вашего цикла for.

Я бы отбросил функцию percent_of и упростил бы конец, используя (более Ruby-esque) map функцию, подобную этой:

stat_hash.map do |code, num_times|
  puts "#{code}: #{(num_times*100.0)/total}%"
end

Я бы также рекомендовал использовать что-то более описательное, чем total (например, total_occurences или подобное). Мне не удалось получить доступ к вашему файлу test_log, но я проверил ваш код с моим изменением на фиктивном журнале, который у меня был, и он дал точные результаты.

...