Abgefangene Ausnahme mit Stack-Trace protokollieren

Lesezeit: 2 Minuten

Benutzer-Avatar
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.

Benutzer-Avatar
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.

Sie können dies in einem tun catch Block:

try {
    foo();
} catch (Exception $e) {
    error_log("Caught $e");
}

Oder im Ausnahmehandler:

set_exception_handler(function($exception) {
    error_log($exception);
    error_page("Something went wrong!");
});

Benutzer-Avatar
enricog

Sie können die Methoden von verwenden Die Basis von PHP Exception Klasse.

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]);
}

Sie können verwenden http://php.net/manual/en/function.set-exception-handler.php um eine Callback-Funktion zu registrieren, die die Nachricht von $e->getMessage(); und in eine Datei ausgeben.

1334310cookie-checkAbgefangene Ausnahme mit Stack-Trace protokollieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy