Abgefangene Ausnahme mit Stack-Trace protokollieren
Lesezeit: 2 Minuten
Markus Amery
Wenn ich in PHP keine Ausnahme abfange, erhalte ich eine hilfreiche Fehlermeldung in meiner error.log Datei mit Stack-Trace. Wenn ich zum Beispiel laufe:
<?php
function foo() {
throw new Exception('Oh no!');
}
foo();
?>
dann bekomme ich das in meine Logs geschrieben:
[Wed Mar 06 10:35:32 2013] [error] [client 86.146.145.175] Schwerwiegender PHP-Fehler: Nicht erfasste Ausnahme ‘Exception’ mit der Meldung ‘Oh nein!’ in /var/www/test.php:4\nStack-Trace:\n#0 /var/www/test.php(7): foo()\n#1 {main}\n geworfen in /var/www/ test.php in Zeile 4
Manchmal möchte ich die Ausnahme abfangen, aber dieses Detail trotzdem protokollieren. Ich stelle mir sowas vor:
<?php
function foo() {
throw new Exception('Oh no!');
}
try {
foo();
} catch (Exception $e) {
log_exception($e);
}
?>
wo log_exception schreibt in das Fehlerprotokoll etwas im Grunde im gleichen Format wie das, was automatisch für eine nicht abgefangene Ausnahme geschrieben wird – vielleicht buchstäblich identisch, abgesehen davon, dass es vorhanden ist Caught exception Anstatt von PHP Fatal error: Uncaught exception.
Gibt es eine integrierte Funktion, um Ausnahmeinformationen wie diese zu protokollieren oder in einer Zeichenfolge zu erfassen? Ich stelle mir etwas Analoges vor traceback.format_exc() in Python.
Jay K
error_log($e);
macht was du willst. Es protokolliert genau dasselbe, was protokolliert worden wäre, wenn Sie die Ausnahme nicht abgefangen hätten, abzüglich des Wortes „Uncaught“ am Anfang. Es tut dies, weil das ist, was die Exception Klasse __toString() magische Methode kehrt zurück.
Verwenden getMessage um die Nachricht zu bekommen Oh no! und verwenden getTraceAsString um eine formatierte Ablaufverfolgung zu erhalten.
Wir verwenden Monolog, um die Protokollierung in unserer Anwendung durchzuführen. Monolog hat einen Formatierer, der Stacktraces drucken kann. Um Ausnahmen mit Ablaufverfolgungen zu protokollieren, verwenden wir einen LineFormatter und rufen für ihn includeStacktraces() auf. (Code unten)
$handler = new \Monolog\Handler\StreamHandler(STDOUT);
$lineFormatter = new \Monolog\Formatter\LineFormatter();
$lineFormatter->includeStacktraces();
$handler->setFormatter($lineFormatter);
$logger = new \Monolog\Logger('root', [$handler]);
try {
//do some throwing
} catch (Exception $e) {
//do some logging, add exception to context
$logger->error($e->getMessage(), ['exception' => $e]);
}