Ü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.