Error handling 如何记录ZF2控制器异常

Error handling 如何记录ZF2控制器异常,error-handling,zend-framework2,Error Handling,Zend Framework2,我正在注册一个Zend\Log实例以获取异常,我需要在最后通过电子邮件发送所有系统错误,现在它只是转到一个文件。但是,它在控制器中不起作用,异常会显示在视图中(或者不显示,取决于display\u exceptions)。我发现了这个,似乎没人太在意。所以我需要一个解决办法。有没有办法让控制器不吃我的异常 'service_manager' => array( 'factories' => array( 'Logger' => function ($sm

我正在注册一个Zend\Log实例以获取异常,我需要在最后通过电子邮件发送所有系统错误,现在它只是转到一个文件。但是,它在控制器中不起作用,异常会显示在视图中(或者不显示,取决于
display\u exceptions
)。我发现了这个,似乎没人太在意。所以我需要一个解决办法。有没有办法让控制器不吃我的异常

'service_manager' => array(
    'factories' => array(
        'Logger' => function ($sm) use ($sRootDir)
            {
            $log = new Zend\Log\Logger();
            $writer = new Zend\Log\Writer\Stream($sRootDir . '/temp/license.log');
            $log->addWriter($writer);
            Zend\Log\Logger::registerErrorHandler($log);
            Zend\Log\Logger::registerExceptionHandler($log);
            return $log;
            },
    ),

您可以附加到分派错误事件:

Module.php

public function onBootstrap(MvcEvent $e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    /**
     * Log any Uncaught Errors
     */
    $sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
    $sm = $e->getApplication()->getServiceManager();
    $sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
         function($e) use ($sm) {
            if ($e->getParam('exception')){
                $sm->get('Logger')->crit($e->getParam('exception'));
            }
         }
    );
}
简单记录器的示例服务配置

'factories' => array(
    'Logger' => function($sm){
        $logger = new \Zend\Log\Logger;
        $writer = new \Zend\Log\Writer\Stream('./data/log/'.date('Y-m-d').'-error.log');
        $logger->addWriter($writer);
        return $logger;
    },
    // ...
);
您还可以记录堆栈中的所有异常,以便更好地了解发生了哪些错误,而不是只显示最后一个异常,因为它可能不包含太多信息

public function onBootstrap(MvcEvent $e)
{
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    /**
     * Log any Uncaught Exceptions, including all Exceptions in the stack
     */
    $sharedManager = $e->getApplication()->getEventManager()->getSharedManager();
    $sm = $e->getApplication()->getServiceManager();
    $sharedManager->attach('Zend\Mvc\Application', 'dispatch.error',
        function($e) use ($sm) {
            if ($e->getParam('exception')){
                $ex = $e->getParam('exception');
                do {
                    $sm->get('Logger')->crit(
                        sprintf(
                           "%s:%d %s (%d) [%s]\n", 
                            $ex->getFile(), 
                            $ex->getLine(), 
                            $ex->getMessage(), 
                            $ex->getCode(), 
                            get_class($ex)
                        )
                    );
                }
                while($ex = $ex->getPrevious());
            }
        }
    );
}

谢谢,它能工作(在删除获得翻译的那行之后)。@Andrew如何使用这个?你能给出一个小例子,记录事件是如何触发的吗?提前非常感谢!