Apacheアクセスログと私(ログを順番に整形出力)

いよいよ,アクセスログを整形する部分を作る.

CGIクラスの使い方が分からなかったり,繰り返しを抜ける条件を間違ったり,例によってすったもんだあったあげく,作ったのがコレ.


logfile = open(lastlog())

ignore = Regexp.new(IGNORE_FILE + "$")

topuri = Regexp.new("^" + URI_SELF)

while logline = logfile.gets

  line = Accesslog.new(logline)

  unless ignore =~ line.requestURI

    print "<dt>Datetime</dt><dd>#{line.year}年#{line.month}月#{line.day}日"

    print "#{line.hour}時#{line.minute}分#{line.second}秒</dd>\n"

    print "<dt>IP Address</dt><dd>#{line.ip}</dd>\n"

    print "<dt>Access URI</dt><dd>#{line.requestURI}</dd>\n"

    print "<dt>Referer</dt><dd>"

    case line.referer

      when topuri

        print "(サイト内)</dd>\n"

      when "-"

        print "(ダイレクトアクセス)</dd>\n"

      else

        print "<a href=\"#{line.referer}\">#{line.referer_unencode}</a></dd>\n"

    end

    print "<dt>User Agent</dt><dd>#{line.user_agent}<hr></dd>\n"

  end

end



logfile.close



footer_out()


header_outは,ヘッダ部分を表示する部分.

以前に考えていたとおり,画像等へのアクセスは省きたかったので,ignoreという正規表現クラスを作って,リクエストされたファイル名の末尾と比べている.IGNORE_FILEは,今のとこ,IGNORE_FILE = "css|jpg|gif|js|mid"こんな感じ.

出力してみたら,refererとuser_agentの文字列が「"」でくくってあったので,Accesslogクラスの初期化部分にちょっと追加.


@all.each{|s|

  s.delete!('"')

}


リファラーの表示は外部からだけの物にしたかったので,caseで場合分けしている.それから,検索文字列をエンコードするべく,Accesslogクラスにreferer_unencodeメソッドを追加.


def referer_unencode #リファラーを返す(アンエンコード済)

  ref = CGI.unescape(@all[10])

  return NKF.nkf("-e", ref)

end

以下がヘッダ表示部.引数にページタイトルをもらって表示する.

#ヘッダー表示関数

def header_out(title)

  cgi = CGI.new("html4") #HTML 4.0 Strict

  print cgi.header("charset" => "euc-jp","language" => "ja")

  print <<EOF

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html lang="ja">

<head>

<meta http-equiv="Content-Style-Type" content="text/css">

<title>#{title}</title>



<link rel="stylesheet" href="#{STYLE_FILE}" type="text/css">

</head>

<body>

<h1>#{title}</h1>

<dl class="log">

EOF

end

CGIクラスの使い方を詳説しているとこ,無いかなあ.いまいち分からんでなあ.

ちなみに,STYLE_FILEは表示をいじるための外部スタイルファイル.私はこのごろ,ほぼ,外部スタイルシートで表示をいじっていない.HTMLコードによけいな物が無くて綺麗だし,ページに統一感を出すのが楽だから.

フッタは以下の通り.


#フッター表示関数

def footer_out

  print <<EOF

</dl>

</body>

</html>

EOF

end

出力結果

(cgiで表示した物を保存して,適当なところで後ろを省略したもの)

検索文字列の変換がうまくいかない.どうも,nkfだとUTF-8は扱えないらしい.今後の課題だなぁ.

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

コメントを投稿

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

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

Powered by Movable Type