2011-03-19 3 views
0

PHP 오류, 잡히지 않은 예외 및 사용자가 데이터베이스 테이블에 로그온하려는 다른 항목을 기록하기위한 모니터링 솔루션을 구축하고 있습니다. 상업용 젠드 서버 (Zend Server)의 모니터링 솔루션 대체품.오류 처리주기에 연결

Zend_Log를 확장하고 언급 된 모든 경우를 처리 할 수있는 Monitor 클래스를 작성했습니다. 내 목표는 부트 스트랩이 될 한 곳으로 구성을 줄이는 것입니다. logExceptions() 메서드는 확장,

protected function _initMonitor() 
{ 
    $config = Zend_Registry::get('config'); 
    $monitorDb = Zend_Db::factory($config->resources->db->adapter, $config->resources->db->params); 

    $monitor = new Survey_Monitor(new Zend_Log_Writer_Db($monitorDb, 'logEntries'), $config->projectName); 

    $monitor->registerErrorHandler()->logExceptions(); 
} 

registerErrorHandler() 메소드는 DB에 PHP 오류 로깅을 사용하도록 설정 단지 보호 플래그를 설정 : 순간 나는이 같은 모니터를 초기화하고 있습니다. ErrorController errorAction에서

나는 다음과 같은 줄을 추가

//use the monitor to log exceptions, if enabled 
$monitor = Zend_Registry::get('monitor'); 

if (TRUE == $monitor->loggingExceptions) 
{ 
    $monitor->log($errors->exception); 
} 

내가 비록 ErrorController에 코드를 추가하지 싶습니다, 나는 오히려 동적으로 플러그인을 등록 할 것입니다. 그러면 기존 프로젝트에 사용자가 쉽게 통합 할 수 있습니다.

질문 : postDispatch 후크를 사용하는 컨트롤러 플러그인을 등록 할 수 있으며 동일한 효과가 있습니까? 어떤 이벤트가 errorAction을 트리거하는지 이해하지 못합니다. 회로의 여러 단계에서 여러 이벤트가 발생하면 여러 후크를 사용해야합니까?

답변

0

에 파견()를 배치해야합니다 확인합니다. 그래도 내 솔루션에 대한 정보를 추가하고 싶습니다.

내가 그렇게 보이는 컨트롤러 플러그인 썼다 :

class Survey_Controller_Plugin_MonitorExceptions extends Zend_Controller_Plugin_Abstract 
{  
    public function postDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $response = $this->getResponse(); 
     $monitor = Zend_Registry::get('monitor'); 

     if ($response->isException()) 
     { 
      $monitor->log($response); 
     } 
    } 
} 

참고가 $ 응답 -를 사용하는 경우가 Zend_Exception 인스턴스의 배열을 얻을> getException를(). 내가 이해했다면 각 예외를 별도로 기록하는 로그 작성기 메서드에 foreach 루프를 추가하기 만하면됩니다.

거의 모든 것이 예상대로 작동합니다. 현재로서는 두 개의 동일한 예외가 기록되는데 이는 예상했던 것과 다릅니다. 나는 SO에 관한 또 다른 질문을 통해 그것을 조사해야 할 것이다.

+0

플러그인에 예외를 저장하고 응답으로 저장된 스택과 스택이 동일한 지 확인할 수 있습니다. 그런 다음 처리를 건너 뜁니다. – Xerkus

1

스택 인덱스 101로 플러그인을 등록하십시오. routeShutdown 및 postDispatch에서 응답 객체의 예외를 확인하십시오.

$response = $this->getResponse(); 
if ($response->isException()) { 
    $exceptions = $response->getException(); 
} 

예외는 오류 처리기 루프 내부에서 발생 된 경우 Xerkus에 의해 허용 대답은 바른 길에 저를 얻었다 시도-catch 블록

+0

감사합니다. 대답의 첫 부분이 마지막 문장과 어떤 관련이 있는지 자세히 설명해주십시오. 나는 아직 그것을지지하지 않는다. – markus

+0

$ responce-> getException()이 Zend_Exception의 인스턴스를 반환하지 않아야합니까? 그렇지 않습니다. 대신 Array를 반환하고 getMessage() 등을 사용할 수 없습니다. 기묘한!? – markus

+0

좋습니다, $ responce-> getException()은 배열에 예외 스택을 반환합니다. – markus