在ZF2中记录每个请求

时间:2013-01-15 22:41:59

标签: php logging zend-framework2 zend-log

我们正在使用zend框架2用于新的应用程序,我想拥有相同的Rails或类似的日志系统,我想为每个请求创建一个日志,是否可以在Zend中执行此操作?

2 个答案:

答案 0 :(得分:5)

这取决于您要记录的 。如果它只是一个访问日志,您应该尝试使用Web服务器的日志。来自Apache / nginx / IIS等的日志比您在ZF2应用程序中的效果要好。

如果您需要登录ZF2应用程序,您有两种选择。第一个选项是bootstrap。它是您可以使用的最早选项之一,因此可能是最好的选择。不过,您也可以查看routedispatch。这两个事件在" run"申请阶段。通过这些活动,您可以获得路线匹配,因此您知道(或不知道)您的请求是否与任何控制器匹配(或者如果您没有匹配,则它是404)。 / p>

一些例子。我们假设您在ServiceManager密钥下的logger中配置了记录器。然后登录bootstrap

namespace Application;

class Module
{
  public function onBootstrap($e)
  {
    $app = $e->getApplication();
    $sm  = $app->getServiceManager();

    $logger = $sm->get('logger');
    $logger->debug('Log here!');
  }
}

或者,例如,如果您等待route,则附加route事件的监听器:

namespace Application;

use Zend\Mvc\MvcEvent;
use Zend\Mvc\Router\RouteMatch;

class Module
{
  public function onBootstrap($e)
  {
    $app = $e->getApplication();
    $em  = $app->getEventManager();
    $sm  = $app->getServiceManager();

    $logger = $sm->get('logger');
    $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($logger) {
      $match = $e->getRouteMatch();

      // No route, this is a 404
      if (!$match instanceof RouteMatch) {
        return;
      }

      $logger->debug(sprintf(
        'Route event with route %s',
        $match->getMatchedRouteName()
      ));
    });
  }
}

答案 1 :(得分:2)

听起来您可以在dispatch上为Zend\Mvc\Application事件附加听众。

作为参考,Rob Allen创建了一个方便的ZF2 events列表。