2

私は Catalyst (Perl 用の MVC フレームワーク) を使用していますが、この質問はおそらくすべての MVC フレームワークに当てはまります。

今までは、訪問者に関する統計 (ユーザー エージェント、アクセスした URL、時間など) を取得するために Apache ログ ファイルを使用していました。しかし、MVC フレームワークに移行した今、これでは不十分だと思います。たとえば、/1/foo と /1/bar へのリクエストが同じ場合、ログにのみ /1/ を表示したいと考えています。

そのため、統計用に独自のログ ファイルを生成する最善の方法は何かと考えています。アプリケーションの別のログ ファイルとして扱う必要がありますか?

これらの統計はいつでもログに記録できます。理想的には、ページがユーザーに送信された後にログに記録されるため、ログに必要な追加の時間が感じられません。

4

2 に答える 2

4

Catalyst が既にサブルーチン属性を自由に使用していることを考えると、1 つの有用なアプローチは、カスタム ロギング メカニズムで関連するサブルーチンをラップするために属性を使用することです。例としてロギングを使用するこの手法に関する記事を書きました。基本的な考え方は次のとおりです。

use Attribute::Handlers;

sub Log : ATTR(CODE) {
    my ($pkg, $sym, $code) = @_;


    my $name = *{ $sym }{NAME};

    no warnings 'redefine';

    *{ $sym } = sub {
        log_message("Entering sub $pkg\:\:$name");
        $code->( @_ );
    };
}

sub foo : Log { 
    # this will be logged
}
于 2009-05-07T05:50:54.603 に答える
2

その程度の柔軟性が必要な場合、fridoの答えは非常に気の利いたものです。

$c->log->info()OTOHまたはその兄弟の 1 つを使用するだけで、引き続き Apache error_log を使用してこのデータを記録できます。Catalyst::Log を拡張して、他の種類のメッセージを報告するのはかなり簡単です。$c->log->sql()たとえば、SQL::Beautify を介して実行された error_log に SQL を書き込むバリアントを使用します。

の線に沿って何かを想像することができます

sub auto {
    ...
    $c->log->audit(sprintf("%s called by %s", $c->action->reverse, $c->userid));
    ...
}

これを最初に (自動で) 配置することは望んでいたことではありませんが、終了ハンドラーとは異なり、常に呼び出されることがわかっているため、問題は少なくなります。

于 2009-05-07T06:35:28.723 に答える