代码之家  ›  专栏  ›  技术社区  ›  Julien

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

  •  2
  • Julien  · 技术社区  · 16 年前

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

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

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

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

    2 回复  |  直到 16 年前
        1
  •  4
  •   friedo    16 年前

    考虑到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
    }
    
        2
  •  2
  •   RET    16 年前

    如果需要这种程度的灵活性,弗里多的回答是非常漂亮的。

    o您可以继续使用apache错误日志来记录这些数据,只需使用 $c->log->info() 或者它的一个兄弟姐妹。扩展Catalyst::Log以报告其他类型的消息是非常简单的。我用的是 $c->log->sql() 例如,将SQL输出到通过SQL::美化运行的错误日志的变体。

    我可以想象

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

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