いよいよ,アクセスログを整形する部分を作る.
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は扱えないらしい.今後の課題だなぁ.