2013-03-07 113 views
4

我正在爲異常註冊Zend \ Log實例,最後我需要通過電子郵件發送所有系統錯誤,現在只是轉到文件。但是,它在控制器中不起作用,異常顯示在視圖中(或者不是,取決於display_exceptions)。我發現這個bug,似乎沒有人關心它。所以我需要一個解決方法。有沒有辦法讓控制器不吃我的例外?如何記錄ZF2控制器異常

'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; 
      }, 
    ), 

回答

14

您可以連接到調度錯誤事件:

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()); 
      } 
     } 
    ); 
} 
+0

謝謝,它的作品(刪除獲得翻譯的行後)。 – Arthur 2013-03-07 13:48:25

+0

@Andrew如何使用它?你可以請一個小例子,記錄事件如何被觸發?非常感謝您提前! – automatix 2015-06-04 08:11:41