Apacheアクセスログと私(ログ1行から各データを得る)

いよいよ整形して,と思い,どう書こうか迷う.アクセスログ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』に書いてあった物を流用しました.ハッシュって,こんな時に便利なんだなーと飲み込んだ例文でした.

日時: 2004年10月12日 | PC/Web > Ruby |

コメント (1)

自分で書いててなんだけど,何で私はなるとを2つにしているんだ?1つでいいじゃないか.というわけで,@@を@に変更.

コメントを投稿

(空欄でもかまいません)

(メールアドレスは管理人に通知されますが,Web上には表示されません)

Powered by Movable Type