Über die Bootstrap hab ich mir meinen Logger konfiguriert und in die Registry abgelegt. Ungefähr so:
public function _initLogger() { $configIni = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', $this->getEnvironment()); // Konsolenlog initialisieren $writerStream = new Zend_Log_Writer_Stream('php://output'); $writerStream->addFilter((int) $configIni->log->console->level); // Mail-Logging initialisieren $configMail = array( 'auth' => 'login', 'username' => $configIni->mail->smtp->user, 'password' => $configIni->mail->smtp->pass, 'ssl' => 'tls', 'port' => $configIni->mail->smtp->port ); $smtp = new Zend_Mail_Transport_Smtp($configIni->mail->smtp->host, $configMail); $mail = new Zend_Mail('utf-8'); $mail->setFrom($configIni->log->mail->from) ->addTo($configIni->log->mail->to) ->addCc($configIni->log->mail->cc) ->setSubject('Fehlermeldungen:') ->setDefaultTransport($smtp); $writerMail = new Zend_Log_Writer_Mail($mail); $writerMail->addFilter((int) $configIni->log->mail->level); // Writer zum Logger hinzufügen $logger = new Zend_Log(); $logger->addWriter($writerStream); $logger->addWriter($writerMail); Zend_Registry::set('logger', $logger); }
Das entsprechende PHP Script required die index.php und bootstrapped so das Zend Framework. Das Script soll im Fehler bzw. Abbruchfall einen Fehler in den Logger schreiben und ebenfalls die Logger-Mail versenden.
require_once __DIR__ . '/index.php'; declare(ticks=1); function shutdown() { if ($error = error_get_last()) { if (isset($error['type']) && ($error['type'] == E_ERROR || $error['type'] == E_PARSE || $error['type'] == E_COMPILE_ERROR) ) { ob_end_clean(); $message = 'Es ist ein Fehler aufgetreten: ' . "\n" . 'Message: ' . $error['message'] . "\n" . 'File: ' . $error['file'] . "\n" . 'Line: ' . $error['line']; /* @var $logger Zend_Log */ $logger = Zend_Registry::get('logger'); $logger->log($message, Zend_Log::CRIT); $logger->__destruct(); } } } //// signal handler function function sig_handler($signo) { switch ($signo) { case SIGTERM: case SIGINT: case SIGHUP: case SIGUSR1: $message = 'Es ist ein Fehler aufgetreten'; /* @var $logger Zend_Log */ $logger = Zend_Registry::get('logger'); $logger->log($message, Zend_Log::CRIT); $logger->__destruct(); exit; default: // handle all other signals } } register_shutdown_function('shutdown');
Hervorzuheben und wichtig sind hier die Zeilen declare(ticks=1);
sowie $logger->__destruct();
. Mit dem Destruktor vom Logger initialisiert ihr das Versenden der Mail, da das Script selber nicht korrekt beendet wurde und die destruct-Funktion vom Logger somit auch nicht aufgerufen wurde.