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

时间:2018-06-13 20:39:22

标签: 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 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

然后使用该数组以某种方式计算每秒的请求,有没有更好的方法我可以使用ruby来做到这一点?不使用CLI工具。

1 个答案:

答案 0 :(得分:1)

这不是最漂亮的,但这是你想要做的。

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

还有更好的方法可以做到这一点 - 包括一个适度冗长的单行 - 但如果你正在寻找直截了当,这就是你要走的路。