いよいよ整形して,と思い,どう書こうか迷う.アクセスログ1行1行を空白で分割して,それぞれに適当な見出しを付けて表示すればいいだけなんだが,条件判断に使いそうな項目もある.そこで,クラスを作ってみることにした.
#アクセスログクラス
class Accesslog
def initialize(line)
@@all = line.chomp.split(/\s/)
datetime = @@all[3]
%r|\[(\d+)/(\w+)/(\d+):(\d+):(\d+):(\d+)| =~ datetime
@@day, @@month, @@year, @@hour, @@minute, @@second = $1, $2, $3, $4, $5, $6
end
def ip #IPアドレスを返す
return @@all[0]
end
def year #年を返す
return @@year
end
def month #月を返す(数値)
return MONTH[@@month.downcase]
end
def day #日を返す
return @@day
end
def hour #時を返す
return @@hour
end
def minute #分を返す
return @@minute
end
def second #秒を返す
return @@second
end
def requestURI #呼ばれたURIを返す
return @@all[6]
end
def status #ステータスコードを返す
return @@all[8]
end
def referer #リファラーを返す
return @@all[10]
end
def user_agent #ユーザーエージェントを返す
i = 11
ua = ""
#空白で区切った結果バラバラになったUA名をつなぐ
while @@all[i]
ua = ua + " " + @@all[i]
i += 1
end
return ua
end
end
……あのですね,クラスってこんな風に使うもんなんでしょうか?おかしなことをしている感がものすごくするんですが.ただ,メインの流れで書いとくよりも,どっかにまとめとく方が,万が一ログの形式が変わってもdefの中を書き換えるだけで対応できるなあと思ったんです.
ちなみに,MONTHは,英語の月名を数字にするためのハッシュ定数.こんな具合になってます.
MONTH = {"jan" => 1, "feb" => 2, "mar" => 3, "apr" => 4, "may" => 5, "jun" => 6, "jul" => 7, "aug" => 8, "sep" => 9, "oct" => 10, "nov" => 11, "dec" => 12}
『たのしいRuby』に書いてあった物を流用しました.ハッシュって,こんな時に便利なんだなーと飲み込んだ例文でした.
コメント (1)
自分で書いててなんだけど,何で私はなるとを2つにしているんだ?1つでいいじゃないか.というわけで,@@を@に変更.
投稿者:Sousui (2004年10月14日 00:37)