Apache-ParseLog-1.02 > Apache::ParseLog

名前

Apache::ParseLog - Apache のログファイルを解析するためのオブジェクト指向 Perl 拡張

概要

    use Apache::ParseLog;
    $base = new Apache::ParseLog();
    $transferlog = $base->getTransferLog();
    %dailytransferredbytes = $transferlog->bytebydate();
    ...

説明

Apache::ParseLog は、オブジェクト指向の構成を利用して Apache のログファイルを 簡単に解析する一つの方法を提供するものである。このモジュールを使って手に入る データは、あなたのアプリケーションに柔軟に利用するのに一般的に十分なものである。 すなわち CGI やシンプルなテキストのみのレポート生成、RDBMS アクセス、 Perl/Tk ベースの GUI アプリケーションのためのデータなどなど。

FEATURES

  1. Easy and Portable Log-Parsing Methods

    このモジュール内で行われるすべての仕事(ログを解析し、正規表現を組み立て、 様々な変数にマッチさせ、あるいは割り当てるといった諸々のこと)によって、 あなたは簡単にログレポートを作成することができる。(あなたのログがものすごく 綿密な調査を必要としているのでない限り。)このモジュールを使ってどうやって 簡単にログレポートを作成できるかを見つけるために、"EXAMPLES" だけでなく この manpage を読んでほしい。

    また、このモジュールは C コンパイラは必要としないし、Perl のサポートする すべてのプラットフォームで動作する(はず)。

  2. Support for LogFormat/CustomLog

    Apache Web Server 1.3.x の新しい LogFormat/CustomLog 機能(mod_log_config を利用した)を サポートしている。

    この log format は Apache の httpd.conf ファイルの LogFormat ディレクティブで 記述されるものだが、このモジュール内で httpd.conf を解析し、動的に 正規表現を生成する。これにより log format が変更になっても、あなたの既存 のコードの修正は最小限になるだろう。

  3. Reports on Unique Visitor Counts

    伝統的に、ヒットカウントは訪問者にリクエストされた files の数をもとに算出 される。(最も単純なものは「合計ヒット数」ということで log ファイルの行数の合計である。)

    このように、ヒットカウントは「どれだけの人が実際に私のサイトを訪れたのか」という 意味では明らかにミスリーディングの可能性がある。特にあなたのサイトのページが 画像を多く含む場合は。(だからそれぞれの画像をひっくるめて1ヒットととして カウントされる。訳注:これはこのモジュールでは、という意味かな?)

    Apache::ParseLog はこのような伝統的なデータを取得するメソッドを提供している。 これらのデータはまた、あなたの Web サイトの動きをモニタリングするためにとても 重要なものでもあるからである。しかしながらこのモジュールは また unique visitor counts を取得するメソッドも提供している。 すなわち、実際にあなたの Web サイトを訪れた「人々」(まぁ IP とかホスト名)の 日付けごと、時間ごと、あるいは日付と時間の両方で算出した数である。

    こららのメソッドについての詳細は "LOG OBJECT METHODS" を参照されたし。

  4. Pre-Compiled Regex

    Perl 5.005 で導入された新しい pre-compiles 正規表現の機能を利用している。 (もしあなたのマシンに対応バージョンのものがインストールされていれば。)

    pre-compiled 正規表現と新しい quote-like 演算子(qr)については perlop(1) と perlre(1) の manpages を参照のこと。

CONSTRUCTOR

Apache::ParseLog オブジェクトを構成するには、他のモジュールとまったく 同じように new() メソッドが利用できる。

new() コンストラクタは Apache::ParseLog base オブジェクトを返す。 base オブジェクトは log object を生成するだけでなく基本的なサーバ情報を 取り扱うものである。

New Method

new([$path_to_httpd_conf[, $virtual_host]]);

new() メソッドを使うと、Apache:ParserLog オブジェクトは 3つの異なる方法で生成することができる。

  1. $base = new Apache::ParseLog();

    この最初のメソッドは空のオブジェクトを生成する。これはオブジェクトの 各フィールドが未定義(undef)であることを意味する。すなわち、 オブジェクトはサーバ名が何であるかを知らないしログファイルがどれかも しれないといった具合である。これはあなたが解析しなければいけない ログファイルがローカルの Apache サーバの生成したもの ではない 場合に 有用である。(例えばどこからか FTP で取得したログファイルなど。)

    あなたは他のメソッドを呼び出すために config メソッド(下記参照)を 用いなければいけない。

  2. $base = new Apache::ParseLog($httpd_conf);

    この2番目の方法は $httpd_conf から必要な情報を展開してオブジェクトを 生成するものである。$httpd_confhttpd.conf ファイルの絶対パスの スカラー文字列が入る。例えば

        $httpd_conf = "/usr/local/httpd/conf/httpd.conf";

    このメソッドは $httpd_conf から、以下の Apache ディレクティブの 情報を展開することを試みる。ServerName, Port, ServerAdmin, TransferLog, ErrorLog, AgentLog, RefererLog, および LogFormat と ともにユーザー定義の CustomLog である。

    もしこれらのディレクティブのうちどれかが $httpd_conf の中で見つけられなかった、 あるいはコメントアウトされていた場合は、そのディレクティブのための フィールドは空(undef)となる。また呼び出したときに空文字列を返す 特殊なフィールドを使うメソッドと通信した場合はエラーで終了する。 (以下のセクションの log object methods 参照。)

  3. $base = new Apache::ParseLog($httpd_conf, $virtual_host);

    この方法は2番目の方法とよく似たオブジェクトを生成する。$virtual_host で VirtualHost を特定している点 だけ を除けば。<VitualHost xxx> と </VirtualHost>の タグの中で定義されない Apache のディレクティブとルールは httpd.conf ファイルの 「標準の」サーバセクションから解析される。

    $httpd_conf$virtual_host オブジェクトを生成するために 必ず 記述 しなければいけない ことに注意。

BASE OBJECT METHODS

このセクションでは、上に書いた new() コンストラクタによって生成された base オブジェクトに対して利用できるメソッドについて述べる。

空の引数で生成された場合を除いて、Apache::ParserLog モジュールは 基本的な httpd.conf ファイル(第1引数として渡された)の中の基本的な 設定を解析する。オブジェクトは log object を生成するために情報を利用する。

利用できるメソッドは以下の通り。(括弧の中に書かれた値を返す。)

    $base->config([%fields]); # (object)
    $base->version(); # (scalar)
    $base->serverroot(); # (scalar)
    $base->servername(); # (scalar)
    $base->httpport(); # (scalar)
    $base->serveradmin(); # (scalar)
    $base->transferlog(); # (scalar)
    $base->errorlog(); # (scalar)
    $base->agentlog(); # (scalar)
    $base->refererlog(); # (scalar)
    $base->customlog(); # (array)
    $base->customlogLocation($name); # (scalar)
    $base->customlogExists($name); # (scalar boolean, 1 or 0)
    $base->customlogFormat($name); # (scalar)
    $base->getTransferLog(); # (object)
    $base->getErrorLog(); # (object)
    $base->getRefererLog(); # (object)
    $base->getAgentLog(); # (object)
    $base->getCustomLog(); # (object)
  • config(%fields]);

        $base = $base->config(field1 => value1,
                              field2 => valud2,
                              fieldN => valueN);

    このメソッドは Apache::ParserLog オブジェクトを設定するものである。使えるフィールドは以下の通り。

        Field Name                     Value
        ---------------------------------------------------------
        serverroot  => server root ディレクトリの絶対パス
        servername  => サーバの名前。言い換えると "www.mysite.com"。
        httpport    => httpd のポート。すなわち 80 とか。
        serveradmin => サーバ管理者。"[email protected]" とか。
        transferlog => transfer ログの絶対パス(訳注:access ログのこと?)
        errorlog    => error ログの絶対パス
        agentlog    => agent ログの絶対パス
        refererlog  => referer ログの絶対パス

    このメソッドは空のオブジェクトを生成(new() 上記参照)したあとに 呼び出されるべきである。しかし、$httpd_conf$virtual_host を定義して 作成したオブジェクトでも、このメソッドを呼び出してあらゆるフィールドの値を 上書きすることができる。(あなたのマシンに HTTP サーバがまったく動いていなくて、 どこからか転送してきたログファイルを解析しなければいけないときに便利である。)

    すべてのフィールドは必須ではないが、最低限一つのフィールドは特定される べきである。(そうでないならなぜあなたはこのメソッドを使うのだ?)

    このメソッドは空のオブジェクトから呼び出され、またすべてのフィールドが 明記されている わけではない とき、空のフィールドはそのまま 空のままである。(したがって、いくつかの対応するメソッドは使えないだろう。)

    このメソッドがすでに(new($httpd_conf[, $virtual_host]) によって)設定された オブジェクトから呼び出された場合、この config メソッドで明記されている フィールドは、既存のフィールド値を上書きされ、残りの明記されていない フィールドについては、これまでの値がそのまま引き継がれる。

    注1 このメソッドは 新たに設定されたオブジェクトを返す、そのため新しい オブジェクトを生成するため代入演算子を使うように。(以下の例を参照。)

    注2 あなたは CustomLog の値を(再)設定することは できない。これが 設定できるとログフォーマットの破綻の可能性が高くなり、使い物にならない 解析結果を提供することにだろう。

    Example 1

        # まず空のオブジェクトを生成
        $base = new Apache::ParseLog();
        # あなたの Web サイトホスティングサービスから転送したファイルに対して
        # transer と error のフィールドだけを設定
        $logs = "/home/webmaster/logs";
        $base = $base->config(transferlog => "$logs/transfer_log",
                              errorlog    => "$logs/error_log");

    Example 2

        # $httpd_conf とともにオブジェクトを生成
        $base = new Apache::ParseLog("/usr/local/httpd/conf/httpd.conf");
        # いくつかのフィールドを上書き
        $logs = "/usr/local/httpd/logs";
        $base = $base->config(transferlog => "$logs/old/trans_199807",
                              errorlog    => "$logs/old/error_199807",
                              agentlog    => "$logs/old/agent_199807",
                              refererlog  => "$logs/old/refer_199807");
  • serverroot();

        print $base->serverroot(), "\n";    

    httpd.conf ファイルの中に書かれた Web サーバの root を含むスカラー値を返すか、 そのオブジェクトが明記されていなかったら undef を返す。

  • servername();

        print $base->servername(), "\n";

    Web サーバの名前を含むスカラー値か、サーバ名が定義されていない場合は undef を返す。

  • httpport();

        print $base->httpport(), "\n";

    httpd に使われるポート番号を含むスカラー値か、定義されていない場合は undef を返す。 (デフォルトでは httpd は 80 番ポートを利用する。)

  • serveradmin();

        print $base->serveradmin(), "\n";

    サーバ管理者の名前を含むスカラー値か、定義されていない場合は undef を返す。

  • transferlog();

         die "$!\n" unless -e $base->transferlog();

    transfer ログファイルの絶対パスを含むスカラー値か、未定義の場合は undef を返す。

  • errorlog();

         die "$!\n" unless -e $base->errorlog();

    error ログファイルの絶対パスを含むスカラー値か、未定義の場合は undef を返す。

  • agentlog();

        die "$!\n" unless -e $base->agentlog();

    agent ログファイルの絶対パスを含むスカラー値か、未定義の場合は undef を返す。

  • refererlog();

        die "$!\n" unless -e $base->refererlog();

    referer ログファイルの絶対パスを含むスカラー値か、未定義の場合は undef を返す。

  • customlog();

        @customlog = $base->customlog();

    $httpd_conf の中で定義されている custom ログの nicknames を含む配列を返す。

  • customlogLocation($log_nickname);

        print $base->customlogLocation($name), "\n";

    $name という名前の custom ログの絶対パスを含むスカラー値を返す。 もし $name という custom ログが存在しない場合は undef を返す。

    このメソッドはデバッグ目的のためだけに利用されるべきである。これはログを 解析するために getCustomLog() を呼び出すことができるからであり、 これによって custom ログファイルをあなたのスクリプトで手動で開く 必要をなくすことができる。

  • customlogExists($log_nickname);

        if ($base->customlogExists($name)) {
            $customlog = $base->getCustomLog($name);
        }

    custom ログ $name(例えば common とか combined)が $httpd_conf ファイルの 中で定義されており、かつ そのログファイルが存在する場合に 1 を返し、 そうでない場合に 0 を返す。

    あなたは通常このメソッドを呼び出す必要は ない。このメソッドは getCustomLog($name) メソッドの内部で呼び出されているからである。

  • customlogFormat($log_nickname);

        print $base->customlogFormat($name), "\n";

    custom ログ $name として $httpd_conf の中で定義されている "LogFarmat" の 文字列を含むスカラー値を返す。このメソッドはデバッグ目的などの内部利用向きである。

  • getTransferLog();

        $transferlog = $base->getTransferLog();

    TransferLog ファイルから解析した情報にアクセスできるオブジェクトを返す。 ログの情報にアクセスする方法については下記の "LOG OBJECT METHODS" を参照。

  • getRefererLog();

        $refererlog = $base->getRefererLog();

    RefererLog ファイルから解析した情報にアクセスできるオブジェクトを返す。 ログの情報にアクセスする方法は下記の "LOG OBJECT METHODS" 参照。

  • getAgentLog();

        $agentlog = $base->getAgentLog();

    AgentLog ファイルから解析した情報にアクセスできるオブジェクトを返す。 ログの情報にアクセスする方法については下記の "LOG OBJECT METHODS" 参照。

  • getErrorLog();

        $errorlog = $base->getErrorLog();

    ErrorLog ファイルから解析した情報にアクセスできるオブジェクトを返す。 ログの情報にアクセスする方法は下記の "LOG OBJECT METHODS" 参照。

  • getCustomLog($log_nickname);

        $customlog = $base->getCustomLog($name);

    $name で指定したフォーマットの CustomLog ファイルから解析した 情報にアクセスできるオブジェクトを返す。ログの情報にアクセスする方法は 下記の "LOG OBJECT METHODS" 参照。

LOG OBJECT METHODS

このセクションでは以下の base オブジェクトメソッドのいずれかから 生成されたログオブジェクトに対して利用可能なメソッドについて述べる。 getTransferLog(), getErrorLog(), getRereferLog(), getAgentLog(), そして getCustomLog($log_nickname) である。

このセクションは 6つのサブセクションに分かれている。それぞれあるログオブジェクトに 対して利用可能なメソッドについて述べる。

for TransferLog, RefererLog, and AgentLog のすべての メソッドは、getCustomLog($name) で生成されたオブジェクトにおいても 利用できることに注意してほしい。

TransferLog/CustomLog Methods

以下のメソッドは CustomLog オブジェクトだけでなく、 TransferLog オブジェクト(getTransferLog() メソッドで生成された)で 利用できる。これは LogFormat に対応する適切な引数を記録する。

  • hit();

        %hit = $logobject->hit();

    トータルヒットカウントとして少なくとも 'Total' のキーを含むハッシュを返す。 またファイルの拡張子(すなわち html, jpg, gif, cgi, pl など)をキーとして それぞれのキーに対応する値をヒットカウントとして返す。 (訳注:拡張子を含まない、というかファイル名の指定のない場合はどうなるんだろう?)

  • host();

        %host = $logobject->host();

    ホスト名(あるいは名前を解決できない場合は IP)を訪問者のキーに、 またそれぞれのヒットカウントを値とするハッシュを返す。

  • topdomain();

        %topdomain = $logobject->topdomain();

    トップドメイン名(com, net など)を訪問者のキーに、またそれぞれの ヒットカウントを値とするハッシュを返す。

    ホスト名が解決できないか IP アドレスが残っていた場合は、このメソッドの 戻り値では訪問者の数はカウントできない(次の secdomain() も同じ)ことに注意。

  • secdomain();

        %secdomain = $logobject->secdomain();

    セカンダリドメイン名(xxx.com, yyy.net など)をキーとして、 それぞれのヒット数を値に持つハッシュを返す。

    IP を名前解決できない場合は、上の topdomain() メソッドと同じルールが適用される。

  • login();

        %login = $logobject->login();

    訪問者のログイン名(認証されたユーザーのログイン)をキーとし、それぞれの ヒット数を値とするハッシュを返す。

    認証を要求しないファイルのログエントリーはログイン名として "-" の文字が入る。

  • user();

        %user = $logobject->user();

    訪問者のユーザー名(アクセス制限されたディレクトリの際に、 Apache サーバの access.conf ファイルを参照して)をキーとし、それぞれの ヒット数を値とするハッシュを返す。

    アクセス制限の掛かっていないログエントリーはユーザー名として "-" の文字が入る。

  • hitbydate();

        %hitbydate = $logobject->hitbydate();

    特定のファイル(html. jpg など)を訪問者が訪れたときの 日付(mm/dd/yyyy)をキーとして、それぞれのヒット数を値とするハッシュを返す。

  • hitbytime();

        %hitbytime = $logobject->hitbytime();

    それぞれのファイルが訪れられたときの時刻(00-23)をキーとし、 それぞれのヒット数を値とするハッシュを返す。

  • hitbydatetime();

        %hitbydatetime = $logobject->hitbydatetime();

    日付と時刻(mm/dd/yyyy-h)をキーとし、それぞれのヒット数を値とするハッシュを返す。

  • visitorbydate();

        %visitorbydate = $logobject->visitorbydate();

    日付(mm/dd/yyyy)をキーとし、それぞれのユニークユーザー数を値とするハッシュを返す。

  • visitorbytime();

        %visitorbytime = $logobject->visitorbytime();

    時刻(00-23)をキーとし、それぞれのユニークユーザー数を値とするハッシュを返す。

  • visitorbydatetime();

        %visitorbydatetime = $logobject->visitorbydatetime();

    日付と時刻(mm/dd/yyyy-hh)をキーとし、それぞれのユニークユーザー数を値とする ハッシュを返す。

  • method();

        %method = $logobject->method();

    HTTP メソッド(GET, POST, PUT など)をキーとし、それぞれのヒット数を 値とするハッシュを返す。

  • file();

        %file = $logobject->file();

    サーバの DocumentRoot からの相対的なファイル名をキーとし、それぞれの ヒット数を値とするハッシュを返す。

  • querystring();

        %querystring = $logobject->querystring();

    query 文字列をキーとし、それぞれのヒット数を値とするハッシュを返す。

  • proto();

        %proto = $logobject->proto();

    利用されたプロトコル(HTTP/1.0, HTTP/1.1 など)をキーとし、それぞれの ヒット数を値とするハッシュを返す。

  • lstatus();

        %lstatus = $logobject->lstatus();

    最終ステータス(つまり httpd がリクエストを終了した時点)の HTTP コードと メッセージ(例えば "404 Not Found")をキーとし、それぞれのヒット数を 値とするハッシュを返す。

  • byte();

        %byte = $logobject->byte();

    少なくとも 'Total' をキーとして合計の転送バイトを値として含み、 またファイルの拡張子(つまり html とか jpg, gif, cgi, pl など)をキーに、 それぞれの転送量を値に持つハッシュを返す。

  • bytebydate();

        %bytebydate = $logobject->bytebydate();

    日付(mm/dd/yyyy)をキーに、それぞれのヒット数を値に持つハッシュを返す。 (訳注:と書いてあるが、それぞれの「転送量」の間違いではないか。)

  • bytebytime();

        %bytebytime = $logobject->bytebytime();

    時刻(00-23)をキーに、それぞれのヒット数を値に持つハッシュを返す。(訳注:上に同じ。)

  • bytebydatetime();

        %bytebydatetime = $logobject->bytebydatetime();

    日付と時刻(mm/dd/yyyy-hh)をキーに、それぞれのヒット数を値に持つ ハッシュを返す。(訳注:さらに同じ。)

ErrorLog Methods

Apache のバージョン 1.2.x までは、それぞれのエラーログエントリーは 単なるエラーだった。これの意味するところは「本当の」エラー(例えば File Not Found や CGI の動作不良など)とさして重要でないエラー(例えば httpd プロセスの再起動)の間の区別がなかったということである。

バージョン 1.3.x の開始以降、Apache httpd はそれぞれのエラーログエントリの 「型」、すなわち "error", "notice" と "warn" を記録する。

もしあなたが Apache 1.2.x を使っている場合は、errorbyxxx(), noticebyxxx(), warnbyxxx() は使うべきでない。それはこれらの メソッドが 1.3.x 向けのものであり、ただ単に空ハッシュを返してくるだけだからである。 allbyxxx() メソッドは望ましい結果を返してくれるだろう。

以下のメソッドは ErrorLog オブジェクト(getErrorLog() メソッドで生成された で利用可能である。

  • count();

        %errors = $errorlogobject->count();

    エラーログファイルに記録されているそれぞれのメッセージの数を含むハッシュを返す。

    キーと値は以下のようになっている。'Total' (エラーの総合計)、'error'(error 型の エラーの合計)、'notice'(notice 型のエラーの合計)、'warn'(warn 型のエラーの 合計)、'dated' (日付入りのエラーの総合計)、'nodate'(日付なしのエラーの総合計)。

    すると具体的にはこんな感じ。

        print "Total Errors: ", $errors{'Total'}, "\n";
        print "Total 1.3.x Errors: ", $errors{'error'}, "\n";
        print "Total 1.3.x Notices: ", $errors{'notice'}, "\n";
        print "Total 1.3.x Warns: ", $errors{'warn'}, "\n";
        print "Total Errors with date: ", $errors{'dated'}, "\n";
        print "Total Errors with no date: ", $errors{'nodate'}, "\n";

    Apache のバージョン 1.3.x 以前が作った ErrorLog ファイルについては、 'error', 'notice', 'warn' の値はゼロになることに注意。

  • allbydate();

        %allbydate = $errorlogobject->allbydate();

    エラーが記録された日付(mm/dd/yyyy)をキーとし、それぞれのエラーの発生した数を 値に持つハッシュを返す。

  • allbytime();

        %allbytime = $errorlogobject->allbytime();

    時刻(00-23)をキーとし、エラーの発生した数を値とするハッシュを返す。

  • allbydatetime();

        %allbydatetime = $errorlogobject->allbydatetime();

    日付と時刻(mm/dd/yyyy-hh)をキーとし、エラーの発生した数を値とするハッシュを返す。

  • allmessage();

        %allmessage = $errorlogobject->allmessage();

    エラーメッセージをキーとし、発生した数を値とするハッシュを返す。

  • errorbydate();

        %errorbydate = $errorlogobject->errorbydate();

    日付(mm/dd/yyyy)をキーとし、それぞれのエラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:と書いてあるが 2.x もイケるのかも。試してないけど。)

  • errorbytime();

        %errorbytime = $errorlogobject->errorbytime();

    時刻(00-23)をキーとし、エラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • errorbydatetime();

        %errorbydatetime = $errorlogobject->errorbydatetime();

    日付と時刻(mm/dd/yyyy-hh)をキーとし、発生したエラーの数を値とする ハッシュを返す。Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • errormessage();

        %errormessage = $errorlogobject->errormessage();

    エラーメッセージをキーとし、エラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • noticebydate();

        %noticebydate = $errorlogobject->noticebydate();

    日付をキーとし、エラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • noticebytime();

        %noticebytime = $errorlogobject->noticebytime();

    時刻をキーとし、エラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • noticebydatetime();

        %noticebydatetime = $errorlogobject->noticebydatetime();

    日付と時刻(mm/dd/yyyy-hh)をキーとし、エラーの発生した数を値とする ハッシュを返す。Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • noticemessage();

        %noticemessage = $errorlogobject->noticemessage();

    notice メッセージをキーとし、発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • warnbydate();

        %warnbydate = $errorlogobject->warnbydate();

    日付(mm/dd/yyyy)をキーとし、エラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • warnbytime();

        %warnbytime = $errorlogobject->warnbytime();

    時刻(00-23)をキーとし、エラーの発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • warnbydatetime();

        %warnbydatetime = $errorlogobject->warnbydatetime();

    日付と時刻(mm/dd/yyyy-hh)をキーとし、エラーの発生した数を値とする ハッシュを返す。Apache 1.3.x のログのみ。(訳注:上に同じ。)

  • warnmessage();

        %warnmessage = $errorlogobject->warnmessage();

    warn メッセージをキーとし、発生した数を値とするハッシュを返す。 Apache 1.3.x のログのみ。(訳注:上に同じ。)

AgentLog/CustomLog Methods

このサブセクションでは AgentLog オブジェクト(getAgentLog() メソッドで 生成した)で利用できるメソッドについて述べる。これは LogFormat に 合致する %{User-agent}i を記録している CustomLog についても当てはまる。

  • uagent();

        %uagent = $logobject->uagent();

    user agent(あなたがログファイルの中で見る「フルネーム」)をキーとし、 それぞれのヒット数を値とするハッシュを返す。

  • uaversion();

        %uaversion = $logobject->uaversion();

    user agent についての最も基本的で単純な情報(agent ログファイルの 最初のカラム、例えば "Mozilla/4.06")をキーとし、それぞれのヒット数を 値とするハッシュを返す。例えばパーザエンジンとそのバージョンについての 情報を集め、実装する HTML と/または JavaScript の仕様を決めるのに有用である。

  • browser();

        %browser = $logobject->browser();

    実際のブラウザ(ファイルに記録されている)をキーとし、それぞれのヒット数を 値とするハッシュを返す。

    例えば Netscape Navigator/Communicator は "Mozilla/version" として 記録されるだろうし、またMicrosoft Internet Explorer は同様に "MSIE version" である。

  • platform();

        %platform = $logobject->platform();

    OS(と可能ならそのバージョンとハードウェアアーキテクチャなど) の名前を キーとし、それぞれのヒット数を値とするハッシュを返す。

    例えば UltraSPARC 上の Solaris 2.6 は "SunOS 5.6 sun4u" と報告される。

  • browserbyos();

        %browserbyos = $logobject->browserbyos();

    OS とブラウザの名前(browser (OS) という形式で)をキーとし、 それぞれのヒット数を値とするハッシュを返す。

CustomLog Methods

このサブセクションでは CustomLog オブジェクトでのみ利用可能な メソッドについて述べる。それぞれどの Apache ディレクティブのためのメソッドが どの値のために使われているのかを確認されたし。

  • addr();

        %addr = $logobject->addr();

    訪れられた web siteServerName) ではない) の IP アドレスを キーとし、それぞれのヒット数を値とするハッシュを返す。(LogFormat %a

  • filename();

        %filename = $logobject->filename();

    ファイルの絶対パスをキーとし、それぞれのヒット数を値とするハッシュを 返す。(LogFormat %f

  • hostname();

        %hostname = $logobject->hostname();

    訪問者のホスト名をキーとし、それぞれのヒット数を値とするハッシュを返す。

  • ostatus();

        %ostatus = $logobject->ostatus();

    最初の状態(original status)(すなわち https がリクエストを処理し始めたとき)の HTTP コードとメッセージ(例えば "404 Not Found")をキーとし、それぞれの ヒット数を値とするハッシュを返す。

  • port();

        %port = $logobject->port();

    転送につかわれたポートをキーとし、それぞれのヒット数を値とするハッシュを返す。 (この値はたいていそれぞれのサーバについてキーと値のペアはただ一つの組み合わせに なるだろう。)((LogFormat %p)

  • proc();

        %proc = $logobject->proc();

    それぞれのファイルの転送に対してサーバが使ったプロセス ID をキーとし、 それぞれのヒット数を値とするハッシュを返す。(LogFormat %P)

  • sec();

        %sec = $logobject->sec();

    ファイル名(相対パスか絶対パスか、それとも URL か、これはあなたの ログフォーマットの設定による)をキーとし、その処理を終了するまでに 掛かった最大の秒数を値とするハッシュを返す。この数値は累積したもの ではなく、そのファイルを処理するのに掛かった最大の秒数であることに注意。(LogFormat %T)

  • url();

        %url = $logobject->url();

    URL(DocumentRoot からの相対パス)をキーとし、それぞれのヒット数を値と するハッシュを返す。

Special Method

以下に述べる特殊メソッド getMethods()すべてlog object に ついて呼び出し元オブジェクトから利用できる。

  • getMethods();

        @object_methods = $logobject->getMethods();

    その log オブジェクトで利用できるメソッド名の配列を返す。配列の それぞれの要素はこのセクションで述べてきたメソッドのどれか一つになっている。

    このメソッドを使って、本当に 簡単に Apache ログを解析して報告する スクリプトを書くことができる。例えばこんな感じだ。

        #!/usr/local/bin/perl
        $|++; # バッファを flush
        use Apache::ParseLog;
        # Apache::ParseLog のオブジェクトを生成
        $base = new Apache::ParseLog("/usr/local/httpd/conf/httpd.conf");
        # "my_custom_log" についての CustomLog オブジェクトを取得
        $customlog = $base->getCustomLog("my_custom_log");
        # CustomLog オブジェクトについて利用可能なメソッドを取得
        @methods = $customlog->getMethods();
        # @methods 配列についてくり返し
        foreach $method (@methods) {
            print "$method log report\n";
            # それぞれのメソッドの戻り値を取得
            %{$method} = $customlog->$method();
            # 戻ってきたハッシュについてくり返し
            foreach (sort keys %{$method}) {
                print "$_: ${$method}{$_}\n";
            }
            print "\n";
        }
        exit;

MISCELLANEOUS

このセクションではいくつかのその他のきっと有用なメソッドについて述べる。

  • Version();

    Apache::ParseLog モジュールを含むスカラー値を返す。

Exported Methods

このサブセクションでは Apache::ParseLog で提供される エクスポートされた メソッドに ついて述べる。(エクスポートされたメソッドについての情報は Exporter(3) を参照。)

これらのエクスポートされたモジュールは(main package の)サブルーチンのように 使える(呼び出せる)ことに注意。

  • countryByCode();

        %countryByCode = countryByCode();

    国コードトップレベルドメイン名前をキー、国名を値とするハッシュ表を含むハッシュを 返す。国別のヒット数のレポートを作成するのに使える。

  • statusByCode();

        %statusByCode = statusByCode();

    RFC2068 で定義されている Apache HTTPD サーバのステータスコードをキーに、 その意味を値とするハッシュ表を含むハッシュを返す。

  • sortHashByValue(%hash);

        @sorted_keys = sortHashByValue(%hash);

    %hash で指定したハッシュのソート済みのキーの配列を返す。 ソートは %hash の値について 数値で 降順に行う。

        # custom ログオブジェクトを取得
        $customlog = $log->getCustomLog("combined");
        # "file" についてのレポートを取得
        %file = $customlog->file();
        # %file をヒット数の降順でソート(してそのキーの配列を取得)
        @sorted_keys = sortHashByValue(%hash);
        foreach (@sorted_keys) {
            print "$_: $file{$_}\n"; # print <file>: <hitcount>
        }

レポートを作成する最も基本的で簡単な方法を上の getMethods() の セクションで一つの例として提示した。しかし、この出力のフォーマットは かなりそのまんまで、あまりユーザーフレンドリーではない。

以下に示すものは Apache::ParseLog を使ったいくつかの別な例である。

Example 1: Basic Report

以下のサンプルコードは Apache 1.2.x で作成された TransferLogErrorLog を チェックして、レポートを標準出力に吐いている。(このコードを動かすために やらなければいけないことは $conf を変えるだけである。)

    #!/usr/local/bin/perl
    $|++;
    use Apache::ParseLog;

    $conf = "/usr/local/httpd/conf/httpd.conf"; 
    $base = new Apache::ParseLog($conf);

    print "TransferLog Report\n\n";
    $transferlog = $base->getTransferLog();

    %hit = $transferlog->hit();
    %hitbydate = $transferlog->hitbydate();
    print "Total Hit Counts: ", $hit{'Total'}, "\n";
    foreach (sort keys %hitbydate) {
        print "$_:\t$hitbydate{$_}\n"; # <date>: <hit counts>
    }
    $hitaverage = int($hit{'Total'} / scalar(keys %hitbydate));
    print "Average Daily Hits: $hitaverage\n\n";

    %byte = $transferlog->byte();
    %bytebydate = $transferlog->bytebydate();
    print "Total Bytes Transferred: ", $byte{'Total'}, "\n";
    foreach (sort keys %bytebydate) {
        print "$_:\t$bytebydate{$_}\n"; # <date>: <bytes transferred>
    }
    $byteaverage = int($byte{'Total'} / scalar(keys %bytebydate));
    print "Average Daily Bytes Transferred: $byteaverage\n\n";

    %visitorbydate = $transferlog->visitorbydate();
    %host = $transferlog->host();
    print "Total Unique Visitors: ", scalar(keys %host), "\n";
    foreach (sort keys %visitorbydate) {
        print "$_:\t$visitorbydate{$_}\n"; # <date: <visitor counts>
    }
    $visitoraverage = int(scalar(keys %host) / scalar(keys %visitorbydate));
    print "Average Daily Unique Visitors: $visitoraverage\n\n";
    
    print "ErrorLog Report\n\n";
    $errorlog = $base->getErrorLog();

    %count = $errorlog->count();
    %allbydate = $errorlog->allbydate();
    print "Total Errors: ", $count{'Total'}, "\n";
    foreach (sort keys %allbydate) {
        print "$_:\t$allbydate{$_}\n"; # <date>: <error counts>
    }
    $erroraverage = int($count{'Total'} / scalar(keys %allbydate));
    print "Average Daily Errors: $erroraverage\n\n";

    exit;

Example 2: Referer Report

RefererLog(か referer を記録している CustomLog)は1つのファイルが リクエストされるごとに referer を記録している。これは 10個の画像を含む 1つのページが陸得るとされるたびに 11行が RefererLog に追加されることを 意味している。1行は実際の referer(訪問者がどこからきたか)のためのものだが、 残りの 10行は画像についてのものであり、それらの画像は 10個の画像を持っている ページが 単に 参照している のだが、これが referer として記録される。 これは恐らくあなたが知りたい情報よりいささか情報が多すぎるだろう。

以下のサンプルコードでは CustomLog を referer を含んでいるか(他のものが 混じっているか)チェックし、サーバ内部ではない referer サイトの名前を報告する。

    #!/usr/local/bin/perl
    $|++;
    use Apache::ParseLog;

    $conf = "/usr/local/httpd/conf/httpd.conf"; 
    $base = new Apache::ParseLog($conf);

    $localserver = $base->servername();

    $log = $base->getCustomLog("combined");
    %referer = $log->referer();
    @sortedkeys = sortHashByValue(%referer);

    print "External Referers Report\n";
    foreach (@sortedkeys) {
        print "$_:\t$referer{$_}\n" unless m/$localserver/i or m/^\-/;
    }

    exit;

Example 3: Access-Controlled User Report

あなたが自分のサイト上に .htaccess やそれに類するものでアクセス制限した ディレクトリツリーを構築しているとして、どのユーザーがそのセクションに どれくらいアクセスしているのかをチェックしたいと思っているとしよう。

    #!/usr/local/bin/perl
    $|++;
    use Apache::ParseLog;

    $conf = "/usr/local/httpd/conf/httpd.conf";
    $base = new Apache::ParseLog($conf);

    $log = $base->getCustomLog("common");
    %user = $log->user();

    print "Users Report\n";
    foreach (sort keys %user) {
        print "$_:\t$user{$_}\n" unless m/^-$/;
    }

    exit;

SEE ALSO

perl(1), perlop(1), perlre(1), Exporter(3)

バグ

あまり有名出ないブラウザの場合は AgentLog メソッドを使っても 必ずしも有用な情報が報告されるわけではない。

RefererLog に対して referer() メソッドを適用して得られるデータは、 もしそのファイルが HTTP を通じてアクセスされたものでない場合は見当違いな ものとなるだろう。(つまり referer が "http://" という文字列で始まっていない場合。)

$virtualhost は特定されていて、ServerAdminServerName に ついて <VirtualHost xxx> ... </VirtualHost> の中で何の指定もされて いないが httpd.conf の全体のセクションでその値が適用されている状態で 生成された base オブジェクトは、その全体のセクションの値を引き継がない。

TO DO

パフォーマンス(スピード)の向上。

VERSION

Apache::ParseLog 1.01 (10/01/1998).

作者

Apache::ParseLog was written and is maintained by Akira Hangai ([email protected])

For the bug reports, comments, suggestions, etc., please email me.

コピーライト

Copyright 1998, Akira Hangai. All rights reserved.

This program is free software; You can redistribute it and/or modify it under the same terms as Perl itself.

DISCLAIMER

このパッケージは Apache のログファイルを解析するプログラムを自分自身で書く のに忙しい多くの Web 管理者、Web マスターの役に立つだろうという希望のもとに 書かれている。しかし、このパッケージは生成されたデータをどのように用いようとも 無保証であり、各自の裁量によって利用しなければいけないという条件のもとで 配布されている。筆者はこのパッケージの利用によりどのような結果を生もうとも それに対して責任を有するものではない。

日本語訳の免責と利用上の注意

この日本語訳は原文の意味を正しく伝えることを保証しません。意味の取り違えを鵜呑みにした結果 1日つぶれてしまったとしても、それは私の責任ではありませんので悪しからず。誤訳の指摘は歓迎します。が、いつまでもフォローできるとも限りません。

2003-11-11 T.Watanabe <[email protected]>

日本語訳についての追記

この翻訳はT.Watanabeのご好意によりperldocjpに寄せられたものを 川合孝典([email protected])が一部変更して登録しています。