Autor wpisu: Marek, dodany: 07.02.2013 19:50, tagi: php, zend_framework
Naszym zadaniem jest, oprócz zapisywania błędów aplikacji do logu, automatyczne wysyłanie informacji o problemie na zdefiniowanego maila. Jak to zrobić za pomocą Zend_Log?
Najpierw zainicjujmy zasób log w pliku konfiguracyjnym application.ini:
; log resources.log.file.writerName = "Stream" resources.log.file.writerParams.stream = APPLICATION_PATH "/../data/logs/app.log" resources.log.file.filterName = "Priority" resources.log.file.filterParams.priority = 5
Informacje o priorytecie 5 (Zend_Log::NOTICE) i ważniejsze zapisywać będziemy do pliku app.log.
Plik Bootstrap.php:
/** * Log aplikacji */ protected function _initRegisterLogger() { $this->bootstrap('Log'); $logger = $this->getResource('Log'); if ('production' == $this->getEnvironment()) { // konfiguracja wiadomości wysyłanej na maila $mail = new Zend_Mail('UTF-8'); $mail->setSubject('Hekima - raport błędu!'); $mail->addTo('mheki@localhost'); $writerMail = new Zend_Log_Writer_Mail($mail); // logowane tylko błędy z priorytetem WARN i wyższym $filter = new Zend_Log_Filter_Priority(Zend_Log::WARN); $writerMail->addFilter($filter); $logger->addWriter($writerMail); } // Zapis do rejestru Zend_Registry::set('Zend_Log', $logger); }
Kilka słów wyjaśnienia. Pobieramy zasób Log, w przypadku produkcyjnego środowiska aplikacji, tworzymy obiekt klasy Zend_Mail, który posłuży do wysyłania wiadomości, a także ustawiamy osobny priorytet wysyłanych informacji (Zend_Log::WARN), następnie informujemy obiekt logujący o tym, żeby logi wysyłał na maila. Na koniec możemy jeszcze zapisać obiekt logujący do rejestru celem późniejszego użycia w aplikacji.
W ostatnim kroku możemy jeszcze rozszerzyć wysyłane informacje, modyfikując w klasie ErrorController domyślną metodę errorAction(). Zamieniamy kod:
if ($log = $this->getLog()) { $log->log($this->view->message, $priority, $errors->exception); $log->log('Request Parameters', $priority, $errors->request->getParams()); }
na:
if (($log = $this->getLog())) { $log->log($this->view->message, $priority, $errors->exception); $log->log($errors->exception->getMessage(), $priority); $log->log('Parametry wywołania: ' . print_r($errors->request->getParams(), true), $priority); }
Metoda getLog() wygląda tak:
public function getLog() { $bootstrap = $this->getInvokeArg('bootstrap'); if (!$bootstrap->hasResource('Log')) { return false; } $log = $bootstrap->getResource('Log'); return $log; }
A otrzymany mail przykładowo może wyglądać tak:
2013-01-29T09:05:54+01:00 CRIT (2): Błąd aplikacji 2013-01-29T09:05:54+01:00 CRIT (2): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'hekima.test_events' doesn't exist 2013-01-29T09:05:54+01:00 CRIT (2): Parametry wywołania: Array ( [module] => test [controller] => event [action] => index )