• ベストアンサー

access_logより特定のURLだけをWebalizerにかける方法

access_logより特定のURLだけをWebalizerにかける方法が なかなか見つからず困っています。 access_logの中にはどこのページを誰がアクセスしたかと いうような色々なURLが書かれていますよね? その中で特定のURLだけを取り出して Webalizerにかける方法を探しています。 Perlでプログラミングをしようと思っていますが どなたかご存知の方、もしくは詳しくかかれているHP等、 ご存知の方、お教え願えないでしょうか? よろしくおねがいいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • xjd
  • ベストアンサー率63% (1021/1612)
回答No.3

Apacheには特定のURLへのアクセスを別のログファイル に切り出す機能があります。 httpd.confで以下の様に指定します。 --------------------------------- <IfModule mod_setenvif.c> SetEnvIf Request_URI "文字列1を指定" worm SetEnvIf Request_URI "文字列2を指定" worm SetEnvIf Request_URI "文字列3を指定" worm </IfModule> CustomLog logs/access_log common env=!worm CustomLog logs/worm_log combined env=worm --------------------------------- この例だと、文字列1,2,3へのアクセスがあった場合 worm_logに切り出して保存する事ができます。 これを応用すると、特定のURLへのアクセス情報を を取り出せると思います。試してみてください。 私はnimdaからのアタック(default.ida,cmd.exe, root.exeをアクセスしようとする)を別のログに 切り出しています。

chika_chan
質問者

お礼

xjd様 回答ありがとうございます。 お礼が遅くなってすみません。 実は、私の勘違いがありまして。 access_logから、例えば 「hhhh.ppp.infoweb.ne.jp - - [01/Sep/2002:00:00:00 +0900] "GET /room/111/AAA/menu4.gif HTTP/1.1" 404 305」 こんなログがありまして。 そのうちリクエストURL[/room/111/AAA/menu4.gif]の A[111]とB[AAA]で該当するURLだけ 個々にWebalizerにかけるのです。 少しプログラミングしてみたのですが、 access_logよりい1レコード取り出し splitでスペースごとに取り出し、リクエストURLが 条件に合うものだけ、一時ファイルに1レコード書き込みます。 A:111 B:AAA A:222 B:AAA というように条件は30パターンあります。 ここで、ひとつ問題が。 一時ファイルに書き込むとaccess_logのデータが多すぎて 途中で「out of memory!」となってしまいました。 その後のソートでも、 open (IN, "一時ファイル"); @array = <IN>; close (IN); @array = map {$_->[0]} sort {$a->[5] <=> $b->[5] or $a->[6] cmp $b->[6]} map {[$_, split /\//]} @array; この方法だと、うまくいきそうなのですが、 何にせよ、2つでみて条件も複雑のため ダメです。 長くなってすみませんが、ご意見聞かせてください。 よろしくお願いいたします。

その他の回答 (2)

noname#9414
noname#9414
回答No.2

grepやsedをかけて、別のファイルに保存して、それを解析させればいいのではないでしょうか? ではでは☆

chika_chan
質問者

お礼

Kanata様 回答どうもありがとうございます。 そうですね、別ファイルに一度書き込んで それを解析するという方法でも考えてみます。 ありがとうございました。

回答No.1

access_logの普通の形は、 GET hogehoge.html Referer その前にいたページ GET hogehoge.gif Referer hogehoge.html . . . なので、hogehoge.htmlで引っ掛けてやればいいのではないかと思いますが。 Perlでやるのならば、ファイルをオープンしたあとで、 while <STDIN> {  if (/hogehoge.html/) {     print;  else {  } } なんて感じで、目的のログを標準出力に出すことができると思います(何も見ていないので文法は微妙に違う可能性あり)。 ファイルにするのであれば、出力ファイルを指定/オープンしてそのハンドルに出力を渡すもよし、上記のPerlスクリプトを起動するときに標準出力をリダイレクトしてもいいと思います。 そして得た出力をWebalizerの入力にすればいいでしょう。

chika_chan
質問者

お礼

DVSL様 回答どうもありがとうございます。 そうですね。 URLがaccess_logにかかれていますので それで判別したいと思います。 ありがとうございました。

関連するQ&A