2

我使用 Catalyst(Perl 的 MVC 框架),但这个问题可能适用于所有 MVC 框架。

到目前为止,我使用 Apache 日志文件来获取有关访问者的统计信息:用户代理、访问的 URL、时间等。但是现在我转向 MVC 框架,我认为这还不够。例如,如果对 /1/foo 和 /1/bar 的请求对我来说是相同的,我只想在我的日志中显示 /1/。

所以我想知道生成我自己的统计日志文件的最佳方法是什么。我应该把它当作我的应用程序中的另一个日志文件吗?

这些统计数据可以随时记录。理想情况下,它们会在页面发送给用户后被记录,因此不会感觉到记录所需的额外时间。

4

2 回答 2

4

鉴于 Catalyst 已经大量使用子程序属性,一种有用的方法可能是使用属性将相关子程序包装在自定义日志记录机制中。我写了一篇关于这种技术的文章,它以日志记录为例。基本思想是:

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

如果需要这种程度的灵活性,friedo 的答案非常漂亮。

OTOH,您可以继续使用 Apache error_log 来记录这些数据,只需使用$c->log->info()它或其兄弟之一。扩展 Catalyst::Log 以报告其他类型的消息相当简单。例如,我使用一种$c->log->sql()将 SQL 写入通过 SQL::Beautify 运行的 error_log 的变体。

我可以想象一些类似的东西

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

把它放在开头(自动)不是你想要的,但它肯定不会有问题,因为你知道它总是会被调用,不像结束处理程序。

于 2009-05-07T06:35:28.723 回答