【问题标题】:Log each request in ZF2在 ZF2 中记录每个请求
【发布时间】:2013-01-15 22:41:59
【问题描述】:

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

【问题讨论】:

  • 为什么不使用 Apache 的 access_log?

标签: php logging zend-framework2 zend-log


【解决方案1】:

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

如果您需要登录 ZF2 应用程序,您有两种选择。第一个选项是bootstrap。它是您可以使用的最早选项之一,因此可能是最好的。但是,您也可以查看routedispatch。这两个事件在应用程序的“运行”阶段被调用。有了这些事件,您就有了一个可用的路由匹配,因此您知道(或不知道)您的请求是否匹配任何控制器(或者如果您没有匹配,则为 404)。

一些例子。假设您在ServiceManagerlogger 键下配置了一个记录器。然后登录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()
      ));
    });
  }
}

【讨论】:

  • 太棒了,像往常一样,朱里安。 ;-)
【解决方案2】:

听起来您可以在Zend\Mvc\Application 上的dispatch 事件上附加一个侦听器。

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

【讨论】:

    猜你喜欢
    • 2020-03-30
    • 2013-11-19
    • 2018-08-02
    • 2015-12-30
    • 1970-01-01
    • 2023-02-11
    • 2018-01-10
    • 2021-10-18
    • 2017-02-26
    相关资源
    最近更新 更多