簡易アクセスログ解析
# 月ごとにファイルが分かれる YYYY/MM/DD HH:MI:SS : ip-address [path] user-agent
こんな感じのフォーマットで出力されたアクセスログを、FTPで取得して集計するスクリプトを書こうと思い、久しぶりにRubyを使ってみた。packとFTPとuniqがメインかな。同じIPアドレスはカウントしない。自分のアクセスは、カッコ内の数字。
require 'net/ftp' # パラメータは内緒 # host user password dir prefix home # ログの解析 log = Hash.new an = lambda do |line| row = line.chomp.unpack "A10xA8x3A15xA*" date = row[0].strip ip = row[2].strip iplist = if log.key?(date) then log[date] else [] end iplist << ip log[date] = iplist end # FTPでログを取得 p = ARGV[0] ftp = Net::FTP.open host, user, password ftp.chdir dir ftp.retrlines "RETR #{prefix}.#{p}.log", &an ftp.close # 解析結果を出力 total = 0 log.keys.sort.each do |date| iplist = log[date] unilist = iplist.uniq count = unilist.size except = 0 unilist.each do |ip| if ip.index(home) == 0 except += 1 end end puts "#{date} の件数 : %4d (%4d)" % [count, except] total += count end puts " 総合計 : %4d" % total
実行すると、こんな感じ。
$ ruby an.rb 200610 2006/10/16 の件数 : XX ( 1) 2006/10/17 の件数 : XX ( 0) 2006/10/18 の件数 : XX ( 1) 総合計 : XXX $