#!/usr/local/bin/ruby require 'date' require 'logentry' puts "Usage:: [ruby] webstat.rb " if ARGV.length < 1 inpfile = File.open(ARGV[0]) t1 = Time.now nlines = 0 start_date = end_date = nil le = nil hosts = Hash.new(0) urls = Hash.new(0) referrers = Hash.new(0) uastrings = Hash.new(0) st = Time.now while line = inpfile.gets begin le = LogEntry.new(line) start_date = le.date if !start_date hosts[le.host] += 1; urls[le.url] += 1; referrers[le.referrer] += 1; uastrings[le.ua] += 1; rescue print "Log entry parse failed at line: ", (nlines + 1), ", error: ", $!, "\n" print "LINE: ", line, "\n" end nlines += 1 if nlines % 4096 == 0 et = Time.now puts "processed " + nlines.to_s + " lines ... (" + (et - st).to_s + " seconds)" st = et end end end_date = le.date t2 = Time.now printf("start_date:%s, end_date:%s\n", start_date.to_s, end_date.to_s); printf("lines:%d, hosts:%d, urls:%d, referrers:%d, uastrings:%d\n", nlines, hosts.length, urls.length, referrers.length, uastrings.length); print "Processing time : ", (t2 - t1).to_s, " seconds\n" #$stderr.puts "Hit Enter to continue ..." #$stdin.gets # Do the sorting and display of top 20 def print_top20(label, h) arr = h.sort { |a,b| b[1] <=> a[1] } print "------------ " + label + " -------------\n" for i in 0...20 printf("%2d. %s (%d)\n", i, arr[i][0], arr[i][1]) end puts end t1 = Time.now print_top20("Top 20 Hosts", hosts) print_top20("Top 20 URLs", urls) print_top20("Top 20 Referrers", referrers) print_top20("Top 20 UA Strings", uastrings) t2 = Time.now print "Sort and Display time: ", (t2 - t1).to_s, " seconds\n" #$stderr.puts "Hit Enter to continue ..." #$stdin.gets