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



我有一个日志文件

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 工具。

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

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

有更优化的方法可以做到这一点——包括中等长度的单行本——但如果你正在寻找直截了当,这就是你要走的路。

最新更新