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 |

トラックバック

このエントリーのトラックバックURI: https://irusuka.sakura.ne.jp/mt/nuct.cgi/594

コメントを投稿

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

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

Powered by Movable Type Pro 7.1.2