保存日志/统计信息的最佳方法

时间:2009-05-07 05:16:35

标签: performance logging catalyst

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

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

所以我想知道为统计信息生成自己的日志文件的最佳方法是什么。我应该将其视为我的应用程序中的另一个日志文件吗?

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

2 个答案:

答案 0 :(得分:4)

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

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
}

答案 1 :(得分: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));
    ...
}

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