You can attach send errors to the event:
Module.php
public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); $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')); } } ); }
Example service configuration for a simple registrar
'factories' => array( 'Logger' => function($sm){ $logger = new \Zend\Log\Logger; $writer = new \Zend\Log\Writer\Stream('./data/log/'.date('Ym-d').'-error.log'); $logger->addWriter($writer); return $logger; },
You can also log all exceptions on the stack to better understand what went wrong along the line, instead of showing only the last exception, which may not contain a lot of information.
public function onBootstrap(MvcEvent $e) { $eventManager = $e->getApplication()->getEventManager(); $moduleRouteListener = new ModuleRouteListener(); $moduleRouteListener->attach($eventManager); $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()); } } ); }
source share