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
)
Kanał ATOM
