Ruby 从HTTP访问日志手动计算每分钟的请求数

Ruby 从HTTP访问日志手动计算每分钟的请求数,ruby,Ruby,我有一个日志文件 123.123.123.123 - - [26/Apr/2000:00:23:48 -0400] "GET /pics/wpaper.gif HTTP/1.0" 200 6248 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)" 123.123.123.123 - - [26/Apr/2000:00:23:47 -0400] "GET /asctortf/ HTTP/1.0" 200 81

我有一个日志文件

123.123.123.123 - - [26/Apr/2000:00:23:48 -0400] "GET /pics/wpaper.gif HTTP/1.0" 200 6248 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)"
123.123.123.123 - - [26/Apr/2000:00:23:47 -0400] "GET /asctortf/ HTTP/1.0" 200 8130 "http://search.netscape.com/Computers/Data_Formats/Document/Text/RTF" "Mozilla/4.05 (Macintosh; I; PPC)"
123.123.123.123 - - [26/Apr/2000:00:23:48 -0400] "GET /pics/5star2000.gif HTTP/1.0" 200 4005 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)"
123.123.123.123 - - [26/Apr/2000:00:23:50 -0400] "GET /pics/5star.gif HTTP/1.0" 200 1031 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)"
123.123.123.123 - - [26/Apr/2000:00:23:51 -0400] "GET /pics/a2hlogo.jpg HTTP/1.0" 200 4282 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)"
123.123.123.123 - - [26/Apr/2000:00:23:51 -0400] "GET /cgi-bin/newcount?jafsof3&width=4&font=digital&noshow HTTP/1.0" 200 36 "http://www.jafsoft.com/asctortf/" "Mozilla/4.05 (Macintosh; I; PPC)"
我想计算每分钟的请求数,并输出如下内容

2012/01/01 00:00 2
2012/01/01 00:01 33
File.open("log.txt") do |f|
 f.each_line do |line|
 timestamps <<  line[/\[(\d{2})\/([a-zA-Z]{3})\/(\d{4}):(\d{2}):(\d{2}) (\d{2})\s(-\d{4})]/]
end
我正在考虑在整个文件上循环并提取出一个数组的时间戳,使用这样的正则表达式

2012/01/01 00:00 2
2012/01/01 00:01 33
File.open("log.txt") do |f|
 f.each_line do |line|
 timestamps <<  line[/\[(\d{2})\/([a-zA-Z]{3})\/(\d{4}):(\d{2}):(\d{2}) (\d{2})\s(-\d{4})]/]
end
File.open(“log.txt”)do|f|
f、 每条线都要做|

时间戳这不是最漂亮的,但这是你想要做的

require 'time'
TIMESTAMP_REGEX = %r{\[(.*?)\]} # extract everything between the []

datetimes = log.scan(TIMESTAMP_REGEX).flatten.map { |log_time| DateTime.parse(log_time.sub(":", ' ')) } # get the results from the regex and make an array of DateTime objects

results = Hash.new(0)

datetimes.each do |datetime|
  time = datetime.strftime('%Y/%m/%d %H:%M') 
  results[time] += 1 
end

results.each do |k,v|
  puts "#{k}: #{v} requests"
end

有更多的最佳方法可以做到这一点,包括一个中等长度的一行,但如果你想要直截了当,这是最好的方法。

普罗米修斯可以和这个宝石一起做到这一点,然后你可以用格拉法纳绘制每秒钟的请求。