- ベストアンサー
access_logより特定のURLだけをWebalizerにかける方法
access_logより特定のURLだけをWebalizerにかける方法が なかなか見つからず困っています。 access_logの中にはどこのページを誰がアクセスしたかと いうような色々なURLが書かれていますよね? その中で特定のURLだけを取り出して Webalizerにかける方法を探しています。 Perlでプログラミングをしようと思っていますが どなたかご存知の方、もしくは詳しくかかれているHP等、 ご存知の方、お教え願えないでしょうか? よろしくおねがいいたします。
- みんなの回答 (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をアクセスしようとする)を別のログに 切り出しています。
その他の回答 (2)
grepやsedをかけて、別のファイルに保存して、それを解析させればいいのではないでしょうか? ではでは☆
お礼
Kanata様 回答どうもありがとうございます。 そうですね、別ファイルに一度書き込んで それを解析するという方法でも考えてみます。 ありがとうございました。
- 日吉 龍(@VDSL)
- ベストアンサー率68% (176/258)
access_logの普通の形は、 GET hogehoge.html Referer その前にいたページ GET hogehoge.gif Referer hogehoge.html . . . なので、hogehoge.htmlで引っ掛けてやればいいのではないかと思いますが。 Perlでやるのならば、ファイルをオープンしたあとで、 while <STDIN> { if (/hogehoge.html/) { print; else { } } なんて感じで、目的のログを標準出力に出すことができると思います(何も見ていないので文法は微妙に違う可能性あり)。 ファイルにするのであれば、出力ファイルを指定/オープンしてそのハンドルに出力を渡すもよし、上記のPerlスクリプトを起動するときに標準出力をリダイレクトしてもいいと思います。 そして得た出力をWebalizerの入力にすればいいでしょう。
お礼
DVSL様 回答どうもありがとうございます。 そうですね。 URLがaccess_logにかかれていますので それで判別したいと思います。 ありがとうございました。
お礼
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つでみて条件も複雑のため ダメです。 長くなってすみませんが、ご意見聞かせてください。 よろしくお願いいたします。