2012-03-24 49 views
0

我有一個apache日誌我正在尋找過濾HTTP狀態代碼。因爲我的ruby程序沒有返回正確的數字,所以我手動完成了數學運算。我也打算使用這個相同的代碼,可能通過訪問的IP和URL來輸出vitsits的頻率,但是如果我不能讓我的代碼工作,則不會。Ruby:過濾HTTP狀態的Apache日誌和它們發生的百分比

繼承人我得到了什麼

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

回答

1

我不確定您是否正確複製/粘貼,但我看不到如何成功訪問您的for循環外的percent變量。

我丟棄percent_of功能以及使用該(多紅寶石式的)簡化最終map函數是這樣的:

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

我也建議使用的東西比total(如total_occurences更具描述性的或類似)。我無法訪問您的test_log文件,但我使用我的更改對付了我的虛擬日誌,並且它生成了準確的結果。

+0

這是相當容易的工作,爲我的代碼。我之前嘗試過類似的方式,但無法通過ruby發現「可接受」的方式獲得語法。我的變量可能會使用一些關於描述性的工作,但由於這是一個粗略的副本,我可能會在所有工作後稍後重新命名。非常感謝。 – 2012-03-25 23:42:38

1

這是有道理的使用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 
+0

我會研究所有的csv類可以處理什麼,看看我是否可以用它來處理更多的事情,這可能只是因爲我的Mac運行的是Ruby版本1.8,但我目前得到一個「'get_row':CSV: :IllegalFormatError「消息與上面的代碼片段;但我會看到我可以一起拉。謝謝你的建議,但現在我想我會和保羅的答案一起說。 – 2012-03-25 23:50:33

+0

不客氣。爲1.8簡單替換CSV與FasterCSV。 – pguardiario 2012-03-26 02:20:31